{
 "cells": [
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:42.236141Z",
     "start_time": "2025-06-10T05:18:42.231861Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import sklearn\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "from matplotlib import font_manager\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.model_selection import cross_val_score, GridSearchCV\n",
    "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n",
    "import seaborn as sns\n",
    "import time\n",
    "\n",
    "# 设置中文字体\n",
    "plt.rcParams[\"font.sans-serif\"] = [\"SimHei\"]  # 使用黑体字体\n",
    "plt.rcParams[\"axes.unicode_minus\"] = False"
   ],
   "id": "e6b9916ed40d2a04",
   "outputs": [],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "78e5f9c87b53f0e3"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "",
   "id": "4c9a1d26b5380a83"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:42.254061Z",
     "start_time": "2025-06-10T05:18:42.248978Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def unpickle(file):\n",
    "    import pickle\n",
    "\n",
    "    with open(file, \"rb\") as fo:\n",
    "        dict = pickle.load(fo, encoding=\"bytes\")\n",
    "    return dict"
   ],
   "id": "1472876bca0e88f7",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:42.321483Z",
     "start_time": "2025-06-10T05:18:42.270603Z"
    }
   },
   "cell_type": "code",
   "source": [
    "batch1 = unpickle(\"./data/cifar-10-batches-py/data_batch_1\")\n",
    "print(\"Labels:\")\n",
    "print(batch1[b\"labels\"])\n",
    "print(\"Data:\")\n",
    "print(batch1[b\"data\"])"
   ],
   "id": "a891eef2fa7fdf9f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Labels:\n",
      "[6, 9, 9, 4, 1, 1, 2, 7, 8, 3, 4, 7, 7, 2, 9, 9, 9, 3, 2, 6, 4, 3, 6, 6, 2, 6, 3, 5, 4, 0, 0, 9, 1, 3, 4, 0, 3, 7, 3, 3, 5, 2, 2, 7, 1, 1, 1, 2, 2, 0, 9, 5, 7, 9, 2, 2, 5, 2, 4, 3, 1, 1, 8, 2, 1, 1, 4, 9, 7, 8, 5, 9, 6, 7, 3, 1, 9, 0, 3, 1, 3, 5, 4, 5, 7, 7, 4, 7, 9, 4, 2, 3, 8, 0, 1, 6, 1, 1, 4, 1, 8, 3, 9, 6, 6, 1, 8, 5, 2, 9, 9, 8, 1, 7, 7, 0, 0, 6, 9, 1, 2, 2, 9, 2, 6, 6, 1, 9, 5, 0, 4, 7, 6, 7, 1, 8, 1, 1, 2, 8, 1, 3, 3, 6, 2, 4, 9, 9, 5, 4, 3, 6, 7, 4, 6, 8, 5, 5, 4, 3, 1, 8, 4, 7, 6, 0, 9, 5, 1, 3, 8, 2, 7, 5, 3, 4, 1, 5, 7, 0, 4, 7, 5, 5, 1, 0, 9, 6, 9, 0, 8, 7, 8, 8, 2, 5, 2, 3, 5, 0, 6, 1, 9, 3, 6, 9, 1, 3, 9, 6, 6, 7, 1, 0, 9, 5, 8, 5, 2, 9, 0, 8, 8, 0, 6, 9, 1, 1, 6, 3, 7, 6, 6, 0, 6, 6, 1, 7, 1, 5, 8, 3, 6, 6, 8, 6, 8, 4, 6, 6, 1, 3, 8, 3, 4, 1, 7, 1, 3, 8, 5, 1, 1, 4, 0, 9, 3, 7, 4, 9, 9, 2, 4, 9, 9, 1, 0, 5, 9, 0, 8, 2, 1, 2, 0, 5, 6, 3, 2, 7, 8, 8, 6, 0, 7, 9, 4, 5, 6, 4, 2, 1, 1, 2, 1, 5, 9, 9, 0, 8, 4, 1, 1, 6, 3, 3, 9, 0, 7, 9, 7, 7, 9, 1, 5, 1, 6, 6, 8, 7, 1, 3, 0, 3, 3, 2, 4, 5, 7, 5, 9, 0, 3, 4, 0, 4, 4, 6, 0, 0, 6, 6, 0, 8, 1, 6, 2, 9, 2, 5, 9, 6, 7, 4, 1, 8, 7, 3, 6, 9, 3, 0, 4, 0, 5, 1, 0, 3, 4, 8, 5, 4, 7, 2, 3, 9, 7, 6, 7, 1, 4, 7, 0, 1, 7, 3, 1, 8, 4, 4, 2, 0, 2, 2, 0, 0, 9, 0, 9, 6, 8, 2, 7, 7, 4, 0, 3, 0, 8, 9, 4, 2, 7, 2, 5, 2, 5, 1, 9, 4, 8, 5, 1, 7, 4, 4, 0, 6, 9, 0, 7, 8, 8, 9, 9, 3, 3, 4, 0, 4, 5, 6, 6, 0, 1, 0, 8, 0, 4, 8, 8, 1, 5, 2, 6, 8, 1, 0, 0, 7, 7, 5, 9, 6, 2, 8, 3, 4, 7, 3, 9, 0, 1, 2, 4, 8, 1, 8, 6, 4, 4, 5, 7, 1, 3, 9, 8, 0, 1, 7, 5, 8, 2, 8, 0, 4, 1, 8, 9, 8, 2, 9, 9, 2, 7, 5, 7, 3, 8, 8, 4, 4, 2, 7, 1, 6, 4, 0, 4, 6, 9, 7, 6, 2, 5, 5, 1, 7, 2, 2, 2, 9, 5, 4, 2, 7, 8, 1, 3, 4, 3, 7, 6, 9, 8, 0, 6, 0, 2, 2, 2, 1, 8, 4, 0, 1, 8, 8, 1, 5, 7, 6, 4, 5, 8, 7, 1, 9, 1, 9, 8, 4, 7, 3, 8, 8, 2, 6, 6, 7, 1, 6, 8, 1, 9, 7, 8, 3, 0, 1, 0, 8, 8, 3, 0, 0, 1, 5, 0, 8, 8, 7, 9, 9, 0, 9, 4, 1, 3, 6, 6, 4, 4, 7, 5, 6, 0, 8, 0, 3, 2, 8, 4, 6, 9, 9, 7, 0, 3, 3, 6, 7, 4, 9, 1, 6, 2, 7, 2, 2, 0, 6, 7, 5, 7, 6, 8, 9, 0, 9, 4, 4, 7, 0, 9, 4, 9, 6, 9, 4, 5, 7, 9, 2, 4, 5, 1, 4, 3, 9, 6, 5, 6, 9, 3, 3, 5, 0, 7, 2, 1, 3, 6, 4, 0, 0, 2, 5, 0, 1, 0, 2, 3, 9, 8, 4, 9, 8, 0, 2, 6, 4, 4, 0, 1, 8, 8, 3, 6, 9, 6, 6, 7, 8, 2, 4, 5, 7, 6, 5, 3, 0, 5, 0, 5, 0, 8, 2, 6, 7, 3, 8, 2, 1, 7, 6, 7, 1, 0, 9, 5, 5, 0, 1, 7, 6, 9, 0, 4, 7, 7, 1, 5, 9, 4, 0, 8, 5, 9, 9, 6, 7, 1, 8, 3, 2, 3, 8, 2, 2, 4, 6, 0, 0, 5, 3, 8, 2, 3, 7, 2, 9, 3, 8, 7, 8, 2, 7, 9, 0, 2, 3, 2, 2, 2, 3, 3, 6, 2, 3, 2, 8, 0, 5, 5, 1, 4, 5, 6, 6, 2, 7, 0, 1, 7, 7, 8, 2, 9, 2, 2, 4, 2, 1, 1, 1, 6, 6, 6, 5, 1, 1, 7, 0, 4, 3, 3, 7, 1, 2, 3, 5, 5, 5, 6, 1, 4, 3, 7, 8, 8, 3, 6, 6, 2, 3, 0, 9, 4, 3, 8, 0, 0, 1, 1, 5, 4, 9, 3, 1, 8, 9, 3, 9, 9, 2, 9, 4, 8, 2, 9, 8, 8, 1, 5, 3, 6, 8, 7, 6, 9, 8, 0, 6, 4, 0, 0, 2, 5, 8, 2, 0, 2, 7, 6, 9, 7, 1, 5, 5, 6, 6, 3, 6, 2, 4, 7, 0, 5, 6, 4, 6, 5, 2, 4, 6, 1, 6, 0, 4, 0, 3, 1, 8, 5, 4, 4, 1, 7, 3, 9, 4, 7, 9, 7, 3, 7, 2, 8, 4, 6, 6, 1, 2, 9, 0, 4, 8, 7, 3, 9, 8, 7, 7, 0, 2, 4, 1, 1, 4, 1, 5, 4, 0, 5, 6, 2, 8, 5, 0, 2, 1, 3, 5, 7, 3, 5, 1, 3, 5, 9, 4, 3, 2, 4, 4, 1, 4, 2, 2, 3, 8, 0, 6, 8, 5, 6, 6, 4, 7, 1, 1, 4, 6, 2, 3, 9, 6, 9, 1, 3, 6, 8, 5, 9, 6, 8, 1, 6, 0, 2, 3, 7, 9, 0, 9, 7, 6, 3, 9, 2, 6, 1, 6, 7, 3, 8, 3, 8, 3, 8, 5, 9, 6, 1, 2, 5, 2, 1, 4, 3, 7, 5, 9, 3, 9, 3, 2, 9, 1, 8, 5, 9, 7, 2, 6, 0, 8, 5, 7, 1, 5, 8, 5, 7, 1, 5, 0, 3, 9, 3, 6, 9, 1, 3, 9, 8, 2, 2, 3, 2, 5, 9, 7, 9, 9, 8, 9, 7, 0, 3, 3, 2, 0, 3, 7, 6, 3, 3, 2, 0, 6, 6, 5, 5, 7, 5, 9, 8, 2, 9, 8, 0, 4, 0, 1, 2, 0, 4, 7, 3, 8, 5, 1, 6, 6, 5, 5, 4, 6, 3, 6, 8, 2, 3, 7, 0, 7, 0, 4, 1, 9, 5, 7, 8, 6, 6, 8, 0, 7, 2, 8, 4, 8, 2, 0, 9, 0, 0, 2, 9, 6, 6, 5, 6, 0, 3, 7, 5, 5, 7, 9, 3, 4, 5, 0, 5, 2, 3, 2, 6, 0, 4, 9, 0, 7, 0, 9, 7, 2, 6, 4, 6, 9, 5, 4, 7, 0, 6, 8, 8, 9, 9, 9, 0, 9, 8, 6, 4, 8, 1, 9, 1, 0, 5, 8, 6, 9, 6, 0, 8, 1, 3, 9, 4, 8, 4, 3, 2, 6, 0, 8, 9, 9, 4, 3, 0, 2, 4, 4, 0, 3, 5, 7, 5, 7, 7, 9, 0, 9, 5, 3, 8, 2, 4, 2, 3, 1, 2, 8, 9, 2, 8, 1, 4, 2, 0, 4, 5, 4, 8, 1, 7, 4, 1, 1, 0, 2, 7, 7, 4, 4, 4, 4, 8, 4, 3, 6, 6, 0, 1, 3, 9, 8, 4, 8, 9, 6, 2, 0, 5, 5, 9, 4, 2, 0, 8, 8, 0, 4, 0, 7, 6, 9, 5, 3, 5, 4, 4, 4, 4, 3, 7, 9, 2, 5, 1, 8, 3, 2, 6, 9, 6, 3, 1, 7, 4, 6, 3, 7, 8, 6, 2, 4, 6, 8, 0, 1, 9, 9, 1, 0, 0, 8, 9, 4, 7, 4, 4, 1, 9, 8, 8, 6, 1, 7, 4, 8, 8, 8, 0, 5, 6, 6, 8, 3, 4, 4, 1, 2, 1, 5, 7, 1, 7, 2, 8, 5, 9, 5, 6, 1, 9, 5, 0, 4, 3, 3, 0, 8, 2, 8, 0, 9, 0, 4, 6, 9, 2, 8, 2, 7, 7, 2, 2, 7, 1, 6, 1, 3, 4, 4, 8, 6, 0, 1, 9, 4, 2, 7, 5, 3, 9, 0, 1, 9, 0, 9, 8, 7, 0, 4, 9, 0, 5, 2, 1, 0, 2, 8, 8, 0, 5, 7, 6, 6, 5, 3, 7, 7, 7, 4, 2, 0, 1, 7, 3, 2, 7, 3, 2, 2, 1, 5, 9, 9, 8, 0, 8, 4, 3, 3, 8, 5, 0, 8, 4, 5, 7, 5, 1, 5, 0, 2, 0, 5, 4, 2, 3, 6, 2, 6, 2, 2, 3, 4, 6, 6, 5, 3, 0, 1, 2, 7, 7, 5, 3, 1, 1, 7, 6, 1, 6, 3, 3, 3, 3, 4, 8, 1, 0, 7, 7, 6, 8, 1, 2, 5, 3, 4, 1, 1, 9, 3, 1, 4, 2, 7, 1, 6, 5, 7, 7, 7, 6, 6, 1, 9, 5, 0, 9, 5, 7, 0, 0, 4, 6, 8, 0, 1, 5, 0, 9, 3, 1, 1, 2, 0, 3, 2, 9, 1, 9, 6, 2, 4, 8, 8, 5, 9, 2, 1, 9, 4, 4, 3, 0, 6, 6, 0, 4, 1, 0, 9, 5, 6, 5, 6, 9, 4, 4, 2, 6, 8, 4, 7, 6, 5, 9, 8, 7, 1, 9, 5, 4, 3, 5, 4, 3, 4, 1, 5, 5, 4, 0, 8, 4, 4, 0, 9, 2, 8, 9, 8, 0, 2, 2, 2, 6, 7, 8, 1, 9, 8, 0, 3, 8, 6, 8, 1, 6, 5, 4, 2, 1, 4, 3, 9, 7, 8, 3, 0, 8, 3, 4, 2, 9, 1, 0, 0, 3, 0, 4, 5, 9, 0, 7, 5, 9, 5, 8, 8, 6, 3, 1, 9, 5, 2, 4, 7, 6, 1, 8, 6, 9, 3, 1, 3, 7, 4, 0, 6, 7, 6, 9, 2, 4, 1, 9, 8, 5, 8, 2, 2, 5, 0, 2, 0, 7, 0, 6, 6, 4, 8, 7, 9, 6, 9, 2, 3, 8, 8, 3, 9, 9, 8, 7, 2, 3, 5, 5, 1, 8, 7, 4, 3, 5, 2, 2, 2, 1, 4, 2, 2, 8, 4, 9, 8, 2, 1, 2, 5, 6, 3, 4, 5, 7, 6, 7, 6, 5, 0, 2, 4, 4, 3, 0, 4, 2, 6, 1, 8, 8, 3, 0, 7, 4, 9, 7, 9, 2, 0, 4, 7, 3, 7, 6, 6, 2, 3, 7, 3, 6, 8, 2, 3, 3, 5, 5, 5, 2, 4, 2, 8, 7, 4, 3, 7, 7, 8, 5, 2, 8, 4, 3, 5, 4, 2, 9, 1, 4, 0, 0, 5, 6, 5, 6, 8, 0, 3, 4, 4, 4, 2, 2, 0, 5, 0, 3, 4, 7, 7, 3, 9, 7, 3, 7, 3, 7, 7, 7, 1, 7, 4, 4, 7, 9, 1, 7, 7, 4, 5, 9, 0, 8, 7, 3, 6, 2, 3, 8, 2, 5, 4, 8, 4, 0, 7, 5, 2, 7, 7, 2, 6, 4, 0, 2, 4, 3, 8, 9, 4, 5, 5, 6, 7, 1, 9, 6, 5, 0, 3, 4, 4, 0, 6, 6, 8, 3, 6, 0, 3, 3, 3, 8, 3, 3, 8, 4, 3, 8, 2, 9, 1, 4, 9, 5, 0, 6, 5, 0, 2, 6, 5, 4, 1, 5, 9, 0, 6, 2, 5, 4, 5, 8, 2, 8, 7, 5, 0, 7, 9, 9, 8, 2, 1, 0, 2, 7, 5, 0, 3, 8, 5, 0, 7, 9, 5, 8, 6, 9, 0, 7, 1, 9, 3, 5, 0, 5, 1, 7, 8, 9, 2, 0, 0, 8, 1, 1, 1, 6, 2, 3, 6, 2, 7, 1, 9, 3, 7, 6, 3, 1, 0, 5, 9, 4, 3, 9, 5, 0, 9, 2, 7, 5, 8, 0, 1, 3, 4, 8, 5, 1, 5, 7, 7, 2, 8, 4, 2, 2, 5, 3, 3, 1, 4, 9, 2, 4, 5, 2, 2, 3, 2, 1, 5, 8, 9, 2, 6, 6, 1, 7, 7, 5, 4, 4, 0, 5, 8, 8, 6, 6, 7, 2, 6, 4, 5, 1, 7, 5, 2, 4, 4, 6, 5, 2, 3, 8, 9, 3, 4, 3, 2, 6, 7, 2, 3, 2, 7, 7, 3, 0, 1, 4, 0, 6, 5, 5, 1, 6, 7, 6, 1, 3, 4, 0, 9, 9, 6, 8, 8, 3, 2, 3, 3, 8, 5, 3, 0, 9, 0, 8, 1, 3, 4, 8, 2, 4, 6, 1, 3, 5, 5, 1, 1, 1, 9, 5, 0, 4, 2, 9, 2, 5, 7, 4, 3, 3, 9, 1, 7, 2, 6, 1, 2, 9, 7, 9, 0, 4, 7, 8, 4, 9, 9, 4, 2, 9, 9, 8, 8, 6, 3, 2, 4, 6, 1, 7, 8, 2, 5, 8, 0, 4, 4, 5, 2, 4, 6, 5, 6, 5, 7, 7, 4, 5, 2, 0, 1, 1, 9, 6, 4, 3, 8, 7, 4, 0, 1, 5, 5, 0, 7, 0, 8, 5, 6, 1, 2, 3, 5, 8, 9, 6, 7, 6, 0, 7, 3, 1, 9, 4, 1, 8, 8, 1, 0, 6, 1, 7, 2, 5, 4, 5, 6, 6, 4, 8, 6, 4, 7, 9, 9, 4, 5, 1, 3, 9, 8, 6, 7, 3, 9, 5, 2, 5, 2, 1, 7, 1, 7, 0, 8, 3, 8, 3, 4, 1, 4, 0, 7, 9, 8, 5, 5, 6, 3, 9, 1, 2, 0, 0, 2, 8, 0, 2, 9, 3, 2, 0, 9, 9, 3, 2, 0, 6, 9, 7, 3, 7, 5, 1, 4, 6, 0, 7, 5, 8, 6, 7, 5, 2, 5, 5, 3, 3, 2, 2, 9, 9, 8, 8, 3, 5, 4, 3, 2, 8, 1, 1, 0, 7, 2, 1, 8, 7, 7, 5, 7, 6, 0, 4, 0, 3, 7, 3, 6, 2, 6, 5, 6, 3, 0, 3, 4, 5, 8, 4, 4, 0, 0, 1, 0, 6, 3, 8, 0, 1, 0, 7, 1, 3, 1, 8, 0, 2, 9, 8, 6, 5, 8, 4, 3, 4, 1, 0, 3, 9, 7, 4, 0, 3, 0, 8, 1, 1, 5, 7, 0, 0, 4, 8, 8, 8, 4, 1, 2, 9, 1, 2, 8, 7, 0, 7, 6, 2, 9, 0, 6, 7, 7, 5, 8, 2, 4, 4, 8, 4, 8, 0, 2, 7, 7, 6, 9, 1, 9, 9, 7, 5, 3, 7, 6, 0, 3, 9, 2, 9, 5, 6, 1, 0, 0, 2, 4, 5, 6, 3, 6, 4, 3, 5, 8, 9, 3, 9, 3, 4, 9, 3, 9, 5, 2, 8, 2, 6, 2, 2, 7, 2, 7, 6, 2, 4, 1, 2, 9, 9, 5, 2, 9, 8, 7, 7, 5, 6, 2, 8, 3, 7, 2, 3, 7, 3, 3, 6, 2, 1, 1, 1, 6, 9, 4, 0, 2, 4, 8, 0, 5, 4, 3, 1, 6, 1, 9, 8, 1, 1, 2, 8, 4, 8, 8, 3, 2, 6, 1, 0, 8, 1, 7, 6, 8, 5, 6, 3, 6, 7, 9, 2, 7, 7, 0, 7, 1, 7, 0, 6, 2, 7, 5, 0, 6, 9, 6, 2, 3, 1, 4, 1, 6, 9, 0, 5, 8, 9, 9, 6, 0, 8, 2, 0, 8, 9, 9, 8, 4, 3, 3, 6, 7, 0, 6, 4, 9, 1, 5, 8, 0, 0, 1, 0, 8, 9, 3, 8, 9, 3, 7, 8, 9, 4, 4, 6, 0, 9, 7, 2, 8, 0, 6, 2, 0, 6, 5, 5, 8, 5, 8, 6, 4, 0, 2, 6, 4, 3, 6, 2, 3, 7, 7, 2, 4, 2, 4, 9, 0, 2, 5, 4, 5, 4, 6, 0, 7, 7, 5, 0, 2, 0, 8, 5, 3, 7, 4, 5, 1, 9, 6, 5, 1, 8, 5, 4, 8, 5, 2, 3, 3, 8, 2, 2, 8, 2, 5, 7, 5, 5, 8, 7, 6, 1, 1, 8, 5, 1, 9, 9, 2, 2, 9, 1, 5, 2, 1, 3, 9, 9, 1, 3, 1, 2, 0, 6, 1, 7, 6, 8, 4, 0, 3, 3, 7, 2, 3, 6, 4, 5, 2, 7, 2, 4, 9, 5, 1, 6, 8, 8, 2, 1, 7, 1, 8, 0, 8, 5, 7, 0, 3, 6, 4, 2, 7, 7, 8, 2, 8, 9, 8, 8, 4, 6, 7, 0, 1, 2, 1, 1, 9, 4, 6, 4, 2, 7, 4, 6, 1, 9, 4, 9, 1, 4, 5, 1, 9, 2, 8, 0, 1, 5, 1, 7, 9, 2, 0, 4, 8, 4, 0, 2, 0, 1, 0, 5, 3, 6, 2, 2, 2, 2, 6, 6, 8, 6, 2, 3, 5, 2, 8, 9, 8, 0, 1, 5, 0, 9, 1, 6, 7, 9, 7, 3, 6, 2, 0, 4, 7, 6, 4, 4, 5, 2, 3, 4, 4, 5, 2, 9, 6, 1, 4, 7, 4, 8, 6, 5, 9, 8, 9, 9, 4, 4, 8, 6, 6, 4, 2, 1, 8, 3, 3, 0, 3, 8, 9, 2, 6, 2, 6, 5, 6, 8, 4, 3, 5, 0, 3, 2, 0, 0, 4, 8, 9, 8, 6, 9, 2, 1, 0, 7, 9, 0, 5, 0, 6, 2, 0, 6, 7, 6, 2, 6, 7, 8, 2, 4, 7, 6, 8, 7, 7, 3, 2, 5, 9, 3, 8, 2, 6, 4, 9, 6, 2, 1, 4, 0, 6, 6, 4, 3, 4, 5, 3, 6, 5, 9, 9, 5, 1, 6, 0, 2, 7, 9, 5, 3, 5, 6, 2, 1, 5, 5, 9, 0, 1, 3, 4, 5, 7, 4, 5, 9, 6, 1, 7, 4, 2, 8, 8, 5, 6, 0, 3, 4, 9, 4, 5, 6, 0, 7, 0, 3, 0, 7, 5, 8, 3, 8, 1, 5, 9, 1, 0, 1, 8, 0, 8, 2, 5, 6, 7, 1, 0, 2, 9, 0, 4, 1, 9, 5, 3, 5, 7, 3, 1, 9, 3, 9, 4, 9, 6, 0, 8, 8, 6, 6, 9, 6, 9, 3, 2, 0, 1, 7, 3, 6, 5, 3, 3, 3, 6, 4, 0, 0, 8, 4, 2, 2, 2, 1, 8, 6, 8, 5, 3, 9, 9, 0, 9, 8, 1, 5, 4, 3, 7, 0, 9, 7, 6, 0, 4, 1, 9, 8, 4, 7, 7, 5, 9, 7, 7, 5, 5, 6, 8, 5, 7, 5, 8, 8, 2, 5, 5, 2, 8, 4, 5, 6, 8, 8, 5, 3, 5, 5, 9, 4, 3, 3, 9, 0, 2, 4, 1, 0, 2, 7, 5, 3, 4, 3, 7, 6, 2, 3, 5, 2, 0, 5, 9, 6, 3, 9, 6, 0, 2, 5, 6, 7, 7, 2, 0, 1, 7, 0, 8, 9, 4, 3, 4, 3, 5, 3, 6, 0, 4, 2, 6, 9, 5, 1, 1, 9, 1, 9, 2, 4, 9, 1, 9, 8, 6, 3, 6, 8, 2, 0, 9, 3, 5, 8, 7, 4, 2, 2, 7, 9, 1, 8, 2, 4, 7, 6, 0, 5, 5, 6, 9, 8, 8, 5, 5, 7, 1, 2, 7, 9, 0, 5, 7, 5, 2, 5, 4, 7, 1, 3, 3, 4, 3, 6, 2, 0, 5, 8, 0, 4, 2, 9, 2, 4, 2, 3, 8, 0, 8, 4, 6, 4, 2, 8, 6, 9, 8, 4, 1, 9, 7, 0, 8, 3, 2, 4, 6, 8, 2, 4, 1, 3, 0, 8, 2, 0, 8, 0, 0, 0, 0, 2, 2, 3, 6, 9, 7, 0, 9, 1, 0, 7, 2, 8, 3, 0, 8, 4, 3, 5, 8, 7, 8, 4, 0, 0, 9, 7, 3, 1, 5, 2, 6, 5, 3, 2, 3, 7, 0, 3, 4, 1, 1, 8, 9, 0, 4, 8, 3, 1, 1, 5, 7, 2, 3, 9, 4, 5, 2, 5, 4, 7, 1, 7, 6, 2, 6, 1, 8, 8, 9, 4, 9, 5, 6, 6, 7, 1, 1, 2, 2, 4, 8, 5, 5, 9, 2, 9, 8, 5, 7, 2, 3, 8, 5, 7, 4, 7, 6, 2, 6, 0, 6, 2, 0, 4, 0, 1, 4, 2, 3, 5, 8, 7, 5, 1, 5, 2, 2, 5, 3, 6, 5, 4, 3, 2, 9, 4, 4, 0, 1, 8, 8, 6, 5, 3, 7, 2, 3, 2, 9, 0, 9, 2, 7, 8, 1, 2, 1, 3, 7, 2, 9, 3, 5, 5, 8, 4, 5, 5, 8, 5, 5, 6, 9, 5, 8, 6, 1, 2, 4, 2, 4, 9, 2, 1, 9, 3, 0, 8, 2, 8, 4, 2, 6, 4, 1, 3, 6, 9, 4, 6, 8, 6, 9, 6, 4, 7, 2, 0, 9, 4, 4, 4, 8, 9, 7, 7, 9, 3, 5, 0, 0, 3, 3, 3, 7, 6, 1, 4, 5, 2, 4, 4, 8, 5, 6, 0, 3, 4, 6, 3, 2, 0, 3, 5, 7, 0, 3, 5, 4, 7, 8, 5, 7, 0, 2, 8, 0, 2, 4, 6, 6, 6, 3, 7, 6, 3, 5, 9, 9, 7, 4, 9, 1, 9, 6, 5, 1, 7, 0, 2, 0, 2, 7, 4, 9, 8, 3, 5, 3, 0, 5, 1, 6, 7, 7, 8, 8, 2, 7, 9, 2, 4, 6, 5, 9, 8, 4, 6, 7, 8, 2, 8, 5, 8, 9, 0, 2, 3, 0, 9, 7, 3, 7, 9, 5, 3, 6, 6, 9, 9, 1, 5, 1, 2, 2, 4, 0, 9, 5, 4, 2, 8, 9, 9, 2, 0, 2, 6, 9, 1, 3, 8, 8, 6, 6, 4, 9, 6, 4, 4, 0, 4, 9, 2, 2, 0, 4, 0, 9, 6, 7, 9, 0, 9, 3, 9, 9, 9, 6, 2, 3, 6, 7, 6, 0, 5, 7, 6, 4, 4, 9, 8, 0, 9, 4, 6, 0, 7, 1, 3, 6, 6, 0, 4, 7, 1, 1, 4, 9, 8, 6, 8, 0, 6, 1, 1, 8, 5, 5, 5, 3, 4, 5, 5, 8, 6, 9, 3, 4, 3, 4, 2, 4, 3, 3, 8, 8, 9, 5, 7, 2, 8, 2, 3, 1, 9, 6, 4, 8, 5, 1, 6, 1, 7, 6, 4, 3, 2, 3, 9, 0, 5, 2, 3, 9, 5, 3, 2, 4, 4, 5, 8, 3, 4, 5, 6, 6, 7, 3, 1, 6, 5, 9, 8, 3, 2, 0, 4, 7, 3, 9, 9, 4, 1, 6, 7, 6, 6, 1, 5, 8, 1, 0, 8, 6, 3, 7, 1, 5, 9, 4, 1, 6, 0, 3, 7, 2, 9, 2, 2, 6, 9, 1, 0, 5, 7, 4, 2, 8, 9, 0, 8, 6, 4, 3, 3, 6, 4, 5, 4, 2, 3, 1, 4, 6, 8, 3, 9, 7, 9, 4, 0, 8, 9, 8, 0, 8, 1, 9, 3, 2, 7, 0, 6, 0, 5, 9, 5, 4, 8, 1, 0, 2, 5, 0, 8, 3, 0, 1, 4, 0, 3, 1, 6, 4, 7, 9, 5, 5, 0, 4, 7, 9, 1, 9, 1, 4, 6, 3, 9, 9, 9, 8, 9, 7, 1, 1, 4, 1, 0, 7, 0, 9, 6, 6, 2, 4, 7, 6, 4, 5, 8, 0, 4, 7, 1, 7, 3, 4, 7, 5, 5, 2, 0, 2, 0, 5, 5, 8, 5, 8, 4, 0, 8, 4, 9, 7, 6, 9, 8, 0, 8, 4, 2, 9, 1, 4, 6, 0, 7, 7, 1, 6, 1, 5, 6, 5, 7, 3, 8, 4, 5, 8, 5, 8, 5, 9, 1, 3, 2, 5, 3, 1, 2, 1, 2, 6, 7, 2, 0, 5, 3, 1, 6, 2, 7, 3, 6, 0, 9, 8, 0, 6, 4, 3, 2, 6, 8, 7, 2, 1, 1, 9, 5, 4, 5, 8, 0, 1, 0, 9, 1, 8, 2, 4, 7, 4, 2, 4, 4, 7, 0, 0, 6, 4, 6, 7, 8, 5, 9, 9, 2, 9, 3, 3, 5, 7, 7, 6, 7, 0, 0, 0, 6, 3, 1, 2, 6, 3, 7, 3, 2, 2, 8, 8, 6, 6, 0, 0, 3, 1, 1, 1, 3, 4, 4, 6, 4, 7, 3, 2, 3, 9, 7, 2, 7, 9, 2, 3, 6, 7, 5, 9, 2, 6, 3, 5, 6, 5, 3, 4, 6, 9, 1, 7, 7, 5, 9, 4, 2, 3, 8, 0, 9, 6, 6, 1, 3, 6, 6, 3, 9, 3, 6, 5, 2, 0, 4, 7, 4, 8, 5, 5, 0, 0, 9, 0, 3, 6, 2, 9, 8, 1, 1, 4, 3, 4, 0, 3, 7, 3, 8, 6, 4, 2, 4, 1, 2, 7, 5, 2, 6, 8, 0, 4, 6, 4, 2, 3, 2, 4, 1, 6, 0, 5, 8, 8, 1, 8, 6, 2, 8, 2, 4, 4, 0, 9, 7, 6, 7, 4, 2, 3, 8, 9, 4, 8, 8, 4, 2, 0, 1, 4, 4, 8, 6, 6, 7, 2, 7, 0, 0, 7, 2, 3, 1, 8, 9, 7, 7, 0, 1, 7, 9, 7, 7, 5, 9, 2, 7, 5, 5, 1, 4, 4, 7, 1, 3, 6, 3, 0, 0, 0, 8, 0, 8, 5, 6, 8, 6, 6, 4, 0, 0, 8, 6, 7, 4, 8, 3, 9, 4, 9, 8, 2, 3, 0, 4, 4, 8, 1, 8, 4, 3, 8, 8, 4, 2, 4, 3, 6, 3, 0, 5, 8, 0, 7, 5, 4, 7, 5, 8, 9, 0, 4, 6, 7, 1, 1, 4, 3, 5, 7, 1, 7, 1, 9, 3, 0, 0, 8, 9, 7, 2, 8, 9, 9, 3, 5, 0, 3, 3, 2, 1, 0, 1, 5, 2, 7, 1, 4, 1, 3, 5, 1, 9, 8, 5, 2, 0, 7, 2, 9, 2, 0, 9, 2, 2, 6, 2, 1, 8, 4, 4, 8, 4, 1, 7, 0, 3, 6, 1, 6, 3, 7, 4, 4, 7, 8, 2, 7, 4, 7, 3, 6, 6, 3, 5, 9, 8, 6, 0, 0, 8, 4, 3, 6, 9, 6, 2, 5, 0, 6, 3, 1, 5, 2, 2, 7, 3, 4, 6, 2, 8, 7, 6, 3, 9, 3, 4, 3, 6, 7, 7, 1, 1, 7, 8, 4, 5, 3, 6, 5, 6, 2, 9, 2, 5, 9, 1, 1, 7, 8, 3, 5, 1, 3, 8, 5, 0, 8, 0, 2, 3, 9, 8, 3, 0, 0, 7, 5, 7, 3, 2, 3, 3, 7, 5, 5, 6, 9, 0, 2, 1, 2, 5, 5, 1, 4, 0, 7, 1, 8, 8, 4, 0, 1, 7, 8, 9, 0, 7, 2, 5, 7, 8, 3, 0, 1, 2, 3, 9, 2, 7, 0, 0, 2, 2, 4, 1, 5, 3, 3, 5, 1, 5, 5, 9, 0, 9, 8, 0, 9, 3, 0, 7, 9, 6, 5, 5, 2, 6, 8, 0, 1, 7, 7, 7, 1, 3, 0, 1, 4, 1, 0, 3, 1, 9, 0, 6, 3, 6, 0, 5, 4, 0, 8, 8, 0, 1, 5, 8, 3, 7, 2, 9, 1, 9, 9, 2, 7, 6, 1, 0, 9, 8, 8, 6, 0, 2, 0, 5, 0, 8, 9, 2, 6, 6, 1, 2, 1, 5, 8, 9, 7, 4, 1, 2, 8, 9, 0, 2, 0, 9, 9, 1, 1, 5, 5, 3, 9, 3, 1, 5, 2, 2, 5, 1, 6, 9, 5, 4, 5, 4, 9, 6, 0, 8, 2, 1, 9, 7, 0, 8, 0, 1, 0, 2, 3, 8, 6, 4, 1, 5, 6, 1, 9, 4, 9, 6, 3, 8, 7, 3, 0, 3, 9, 7, 2, 6, 2, 9, 4, 6, 0, 9, 6, 7, 4, 7, 0, 9, 9, 5, 6, 5, 4, 1, 3, 5, 5, 2, 9, 5, 2, 9, 7, 7, 4, 9, 4, 4, 8, 7, 8, 7, 4, 5, 0, 8, 2, 3, 0, 0, 8, 8, 4, 0, 2, 5, 7, 2, 6, 2, 5, 6, 9, 7, 3, 4, 1, 5, 4, 8, 8, 4, 3, 0, 7, 2, 9, 4, 6, 6, 4, 9, 2, 4, 8, 8, 0, 3, 8, 1, 4, 1, 0, 6, 6, 9, 1, 6, 2, 3, 4, 0, 1, 2, 2, 0, 8, 8, 4, 7, 9, 9, 6, 6, 0, 5, 6, 7, 3, 6, 7, 8, 7, 3, 1, 0, 3, 8, 4, 5, 1, 8, 6, 2, 8, 5, 7, 6, 2, 8, 6, 5, 8, 0, 5, 9, 2, 7, 0, 5, 8, 6, 8, 9, 3, 8, 3, 2, 6, 8, 7, 8, 3, 3, 8, 5, 4, 1, 2, 9, 6, 5, 9, 4, 3, 8, 5, 5, 8, 8, 2, 0, 3, 1, 4, 1, 0, 8, 0, 5, 8, 4, 9, 1, 8, 0, 0, 6, 7, 7, 7, 5, 6, 3, 6, 5, 8, 2, 6, 5, 7, 5, 4, 7, 3, 2, 9, 5, 8, 8, 5, 7, 2, 2, 8, 7, 6, 7, 7, 2, 7, 6, 4, 0, 6, 3, 1, 4, 6, 3, 9, 8, 3, 8, 1, 0, 0, 5, 3, 5, 8, 4, 0, 6, 1, 7, 0, 2, 2, 1, 7, 3, 0, 8, 6, 7, 7, 0, 0, 1, 4, 1, 1, 6, 6, 6, 1, 3, 6, 0, 1, 3, 8, 5, 0, 1, 6, 5, 5, 4, 3, 9, 8, 6, 0, 5, 4, 9, 2, 8, 4, 8, 8, 2, 1, 4, 8, 6, 7, 3, 1, 3, 4, 9, 4, 8, 4, 5, 0, 9, 1, 3, 8, 7, 5, 4, 6, 6, 7, 9, 0, 5, 2, 3, 3, 3, 9, 0, 9, 2, 9, 1, 0, 2, 3, 9, 6, 6, 1, 6, 3, 7, 6, 2, 7, 0, 4, 8, 9, 6, 0, 7, 7, 5, 0, 4, 5, 9, 6, 4, 5, 7, 9, 3, 7, 8, 5, 0, 4, 1, 3, 8, 6, 9, 5, 7, 6, 7, 7, 3, 4, 2, 3, 6, 4, 5, 0, 1, 9, 3, 8, 4, 4, 1, 9, 8, 9, 3, 6, 0, 9, 1, 6, 3, 2, 3, 0, 5, 8, 8, 0, 0, 6, 2, 3, 5, 1, 5, 7, 1, 0, 9, 8, 3, 3, 5, 6, 3, 2, 1, 3, 7, 0, 7, 7, 2, 4, 7, 7, 6, 2, 6, 1, 7, 2, 3, 3, 0, 2, 2, 9, 6, 5, 5, 1, 9, 7, 9, 4, 6, 4, 1, 9, 1, 3, 6, 1, 2, 2, 5, 8, 0, 8, 5, 1, 7, 6, 7, 9, 3, 0, 9, 2, 2, 6, 7, 6, 9, 1, 9, 4, 0, 5, 6, 6, 4, 4, 4, 1, 6, 3, 2, 8, 9, 4, 7, 2, 3, 9, 3, 4, 0, 1, 1, 1, 9, 9, 7, 5, 1, 9, 2, 5, 6, 1, 5, 3, 0, 1, 4, 9, 4, 2, 0, 8, 3, 2, 7, 3, 8, 6, 1, 4, 2, 4, 9, 4, 6, 9, 1, 5, 9, 9, 1, 4, 2, 7, 2, 7, 3, 1, 9, 8, 8, 1, 2, 0, 8, 8, 2, 8, 7, 8, 4, 1, 7, 4, 3, 1, 8, 6, 4, 5, 0, 5, 6, 7, 5, 9, 8, 8, 8, 9, 7, 3, 8, 7, 8, 2, 1, 8, 8, 4, 9, 1, 5, 4, 2, 6, 6, 9, 2, 7, 2, 8, 4, 2, 9, 1, 6, 5, 8, 5, 9, 7, 6, 2, 9, 1, 8, 7, 0, 9, 9, 7, 6, 3, 9, 3, 0, 0, 0, 7, 7, 0, 7, 3, 9, 0, 9, 2, 1, 5, 7, 1, 6, 8, 2, 0, 4, 2, 1, 4, 0, 4, 8, 0, 4, 9, 9, 6, 3, 6, 1, 7, 4, 6, 8, 6, 0, 7, 4, 8, 7, 5, 7, 5, 2, 0, 5, 8, 6, 6, 6, 8, 8, 5, 6, 6, 9, 9, 2, 7, 2, 1, 9, 3, 9, 0, 1, 5, 9, 9, 7, 9, 6, 5, 3, 7, 6, 7, 0, 4, 2, 3, 9, 6, 2, 5, 7, 5, 0, 2, 8, 2, 9, 6, 1, 5, 1, 3, 6, 3, 0, 8, 0, 6, 3, 5, 0, 1, 4, 6, 7, 9, 1, 5, 4, 0, 4, 6, 2, 3, 8, 7, 5, 7, 3, 4, 8, 9, 8, 3, 6, 0, 5, 1, 1, 9, 4, 8, 9, 9, 9, 5, 0, 8, 0, 2, 0, 3, 6, 3, 9, 0, 3, 3, 8, 0, 8, 8, 0, 9, 4, 8, 4, 6, 4, 4, 3, 3, 0, 4, 9, 6, 7, 9, 5, 4, 3, 5, 5, 5, 2, 3, 6, 5, 5, 9, 1, 6, 4, 1, 0, 5, 7, 9, 3, 0, 6, 8, 9, 7, 6, 2, 8, 0, 0, 2, 9, 0, 3, 2, 7, 2, 7, 3, 2, 3, 7, 7, 5, 3, 8, 5, 4, 0, 2, 9, 1, 3, 2, 5, 8, 0, 6, 1, 7, 5, 9, 7, 7, 5, 0, 1, 1, 9, 4, 2, 1, 8, 2, 2, 2, 7, 3, 7, 0, 4, 6, 6, 2, 9, 3, 0, 6, 0, 1, 9, 3, 5, 4, 9, 6, 7, 3, 6, 8, 3, 9, 2, 0, 9, 5, 4, 7, 2, 3, 9, 9, 5, 0, 3, 1, 7, 2, 4, 7, 9, 9, 0, 4, 4, 5, 1, 7, 1, 8, 4, 1, 4, 2, 1, 6, 9, 2, 2, 0, 8, 0, 8, 8, 5, 5, 2, 8, 0, 9, 5, 7, 4, 9, 5, 2, 0, 8, 0, 2, 6, 9, 1, 3, 0, 1, 8, 9, 4, 5, 9, 8, 0, 7, 8, 4, 4, 3, 6, 6, 5, 6, 1, 0, 1, 2, 8, 9, 6, 5, 9, 9, 9, 6, 5, 0, 9, 5, 0, 5, 8, 0, 0, 4, 3, 4, 2, 6, 1, 7, 6, 2, 3, 1, 2, 8, 2, 6, 0, 3, 4, 1, 6, 2, 3, 4, 2, 6, 5, 8, 9, 8, 3, 5, 7, 5, 7, 0, 4, 6, 3, 4, 0, 3, 6, 2, 1, 7, 5, 8, 5, 8, 7, 4, 5, 4, 0, 2, 1, 5, 7, 2, 6, 8, 0, 7, 7, 4, 1, 0, 7, 9, 2, 7, 0, 9, 8, 7, 7, 5, 2, 7, 9, 7, 6, 4, 8, 4, 6, 4, 1, 7, 9, 8, 8, 6, 3, 7, 3, 3, 9, 7, 0, 7, 1, 8, 8, 5, 7, 1, 1, 7, 4, 0, 4, 1, 2, 2, 9, 8, 7, 1, 3, 2, 2, 4, 1, 0, 4, 5, 1, 5, 6, 1, 8, 2, 5, 3, 9, 5, 1, 7, 0, 4, 6, 7, 2, 3, 5, 5, 9, 0, 5, 7, 8, 3, 6, 0, 3, 1, 9, 2, 7, 0, 9, 8, 2, 9, 8, 3, 2, 5, 0, 0, 8, 3, 3, 6, 6, 4, 9, 6, 0, 9, 1, 5, 7, 0, 2, 7, 8, 2, 9, 4, 1, 3, 1, 6, 5, 6, 2, 4, 2, 8, 5, 8, 6, 4, 4, 8, 8, 6, 2, 3, 3, 8, 1, 3, 4, 5, 6, 2, 9, 0, 7, 2, 7, 0, 8, 7, 4, 8, 2, 7, 7, 7, 9, 9, 1, 4, 8, 3, 7, 4, 3, 4, 1, 8, 8, 4, 1, 0, 8, 0, 0, 0, 4, 7, 1, 5, 5, 5, 3, 6, 5, 3, 2, 9, 0, 5, 1, 0, 0, 9, 1, 7, 8, 9, 2, 3, 5, 7, 1, 0, 8, 8, 8, 0, 7, 2, 7, 2, 5, 0, 7, 7, 9, 4, 8, 6, 5, 9, 6, 8, 6, 9, 4, 0, 4, 7, 2, 9, 0, 3, 0, 9, 5, 2, 2, 1, 4, 4, 2, 5, 6, 2, 4, 2, 5, 3, 1, 7, 5, 9, 6, 9, 5, 9, 4, 1, 2, 5, 9, 8, 3, 6, 5, 5, 4, 8, 7, 9, 5, 0, 8, 4, 9, 5, 7, 3, 3, 0, 2, 1, 5, 9, 0, 1, 2, 3, 3, 7, 2, 1, 0, 7, 7, 1, 3, 4, 2, 5, 9, 4, 0, 8, 9, 5, 3, 0, 5, 5, 6, 5, 6, 6, 2, 0, 8, 5, 6, 5, 4, 5, 5, 2, 6, 3, 1, 4, 9, 0, 0, 9, 4, 9, 7, 6, 7, 1, 1, 1, 8, 0, 6, 2, 6, 4, 9, 1, 5, 0, 2, 8, 3, 1, 1, 8, 8, 5, 1, 0, 8, 4, 6, 2, 7, 6, 9, 9, 3, 9, 8, 5, 5, 2, 7, 9, 8, 8, 1, 3, 9, 7, 0, 8, 3, 4, 3, 0, 9, 6, 4, 9, 4, 8, 2, 9, 6, 4, 4, 8, 9, 5, 3, 3, 0, 0, 7, 0, 1, 8, 6, 7, 9, 1, 7, 3, 3, 3, 9, 5, 4, 4, 3, 4, 3, 3, 2, 2, 4, 4, 6, 4, 5, 7, 3, 7, 8, 5, 0, 5, 3, 6, 8, 1, 2, 2, 3, 2, 1, 5, 1, 4, 7, 2, 9, 8, 7, 0, 1, 0, 4, 1, 9, 6, 8, 5, 4, 8, 4, 6, 5, 6, 7, 3, 7, 9, 5, 0, 7, 6, 3, 9, 2, 4, 6, 9, 1, 4, 7, 1, 6, 4, 9, 0, 6, 7, 5, 4, 4, 9, 7, 3, 1, 9, 7, 9, 4, 6, 7, 4, 9, 6, 1, 2, 6, 4, 7, 6, 7, 1, 4, 3, 2, 3, 7, 0, 3, 9, 4, 0, 0, 4, 2, 8, 2, 1, 3, 7, 7, 8, 2, 3, 1, 7, 2, 0, 7, 3, 4, 3, 5, 2, 7, 6, 8, 5, 4, 5, 2, 8, 3, 4, 5, 8, 1, 3, 1, 6, 3, 5, 1, 0, 5, 1, 9, 5, 2, 9, 4, 2, 7, 9, 9, 1, 6, 3, 2, 0, 1, 7, 0, 0, 1, 0, 5, 4, 8, 0, 9, 0, 1, 9, 3, 7, 4, 2, 4, 2, 6, 2, 0, 3, 6, 0, 8, 7, 0, 0, 7, 3, 8, 3, 3, 6, 8, 2, 7, 4, 1, 2, 9, 2, 4, 6, 6, 8, 5, 1, 4, 3, 7, 5, 0, 9, 2, 0, 1, 3, 9, 4, 3, 1, 8, 5, 4, 9, 9, 0, 7, 6, 5, 5, 2, 1, 6, 2, 7, 4, 6, 4, 1, 6, 5, 1, 9, 3, 8, 7, 2, 3, 6, 1, 4, 3, 2, 8, 2, 8, 6, 4, 6, 8, 4, 5, 2, 8, 0, 9, 7, 3, 5, 2, 4, 6, 7, 2, 1, 3, 3, 3, 3, 1, 1, 3, 7, 4, 2, 6, 8, 2, 0, 0, 4, 6, 3, 8, 4, 6, 3, 0, 7, 8, 1, 9, 6, 0, 5, 2, 6, 7, 6, 4, 9, 6, 4, 7, 8, 5, 9, 4, 5, 1, 4, 6, 6, 7, 9, 3, 8, 2, 0, 1, 6, 9, 2, 6, 2, 1, 6, 7, 0, 6, 3, 3, 3, 2, 1, 4, 5, 4, 0, 7, 8, 6, 3, 7, 4, 0, 9, 6, 7, 3, 5, 8, 5, 6, 9, 5, 6, 6, 2, 3, 3, 4, 9, 7, 1, 3, 4, 6, 2, 4, 3, 3, 0, 8, 6, 7, 7, 3, 4, 5, 4, 2, 3, 1, 0, 9, 4, 4, 4, 2, 5, 2, 0, 3, 3, 6, 2, 5, 1, 7, 9, 2, 8, 2, 0, 1, 8, 8, 7, 2, 3, 4, 3, 2, 1, 0, 7, 5, 9, 9, 6, 8, 6, 2, 3, 0, 8, 4, 7, 4, 7, 1, 9, 3, 1, 2, 1, 9, 0, 6, 0, 9, 8, 1, 3, 1, 9, 6, 1, 3, 5, 7, 7, 1, 8, 7, 4, 0, 1, 3, 2, 6, 0, 0, 5, 3, 2, 9, 9, 5, 7, 7, 5, 5, 7, 3, 1, 0, 1, 2, 9, 9, 5, 9, 1, 4, 0, 6, 7, 3, 7, 3, 8, 8, 0, 4, 6, 6, 5, 3, 1, 7, 9, 8, 3, 5, 1, 3, 1, 7, 0, 1, 1, 2, 7, 8, 6, 3, 0, 2, 6, 9, 6, 7, 6, 6, 1, 7, 3, 6, 6, 8, 2, 3, 7, 5, 0, 8, 7, 7, 1, 9, 3, 6, 1, 4, 5, 2, 8, 2, 8, 7, 6, 5, 1, 4, 5, 3, 3, 9, 4, 1, 3, 8, 8, 3, 8, 7, 7, 5, 6, 8, 5, 1, 2, 7, 2, 2, 8, 6, 2, 8, 5, 7, 4, 6, 9, 3, 1, 1, 5, 2, 8, 7, 1, 1, 7, 7, 8, 6, 8, 6, 7, 1, 6, 8, 1, 6, 0, 9, 9, 2, 3, 4, 7, 4, 7, 7, 2, 4, 9, 8, 3, 8, 3, 7, 1, 4, 5, 6, 3, 2, 2, 0, 6, 0, 9, 8, 4, 7, 7, 5, 0, 3, 1, 9, 1, 3, 5, 5, 4, 7, 4, 5, 4, 8, 8, 8, 3, 2, 1, 2, 9, 6, 1, 9, 4, 7, 6, 4, 1, 1, 4, 8, 1, 9, 2, 3, 9, 0, 3, 9, 4, 1, 8, 3, 4, 8, 3, 3, 1, 8, 2, 6, 0, 0, 2, 1, 0, 4, 6, 6, 2, 1, 0, 3, 1, 6, 1, 9, 6, 3, 9, 6, 7, 4, 6, 8, 4, 2, 3, 2, 0, 8, 6, 4, 9, 0, 7, 0, 1, 2, 5, 5, 1, 6, 3, 6, 2, 8, 5, 7, 1, 6, 1, 2, 1, 0, 0, 8, 8, 2, 8, 5, 7, 3, 3, 5, 4, 9, 4, 7, 6, 1, 8, 4, 9, 7, 4, 3, 8, 2, 9, 7, 7, 5, 6, 0, 6, 3, 1, 3, 8, 2, 2, 9, 7, 8, 8, 0, 0, 7, 5, 1, 1, 6, 5, 8, 7, 4, 6, 2, 7, 7, 8, 7, 5, 5, 7, 6, 4, 6, 2, 2, 8, 9, 6, 9, 4, 6, 8, 8, 2, 1, 3, 3, 8, 4, 0, 4, 7, 2, 5, 4, 4, 0, 8, 4, 3, 6, 3, 8, 8, 2, 9, 6, 9, 5, 6, 2, 3, 7, 1, 4, 7, 9, 0, 5, 8, 6, 7, 3, 1, 7, 2, 5, 6, 6, 0, 5, 0, 8, 4, 2, 4, 4, 7, 1, 5, 8, 5, 2, 3, 8, 8, 4, 9, 8, 5, 9, 5, 2, 5, 8, 4, 7, 3, 3, 3, 1, 3, 8, 9, 3, 8, 1, 8, 3, 6, 9, 2, 2, 6, 3, 5, 5, 7, 3, 6, 0, 1, 2, 1, 1, 8, 5, 2, 7, 3, 4, 4, 8, 5, 5, 6, 5, 3, 5, 4, 5, 2, 2, 9, 0, 8, 9, 3, 6, 1, 0, 6, 1, 1, 2, 0, 3, 5, 7, 0, 2, 7, 7, 0, 4, 5, 6, 7, 5, 7, 2, 5, 0, 7, 1, 9, 3, 7, 6, 0, 7, 3, 4, 4, 5, 2, 9, 2, 0, 3, 1, 6, 2, 2, 4, 7, 3, 1, 8, 7, 3, 0, 6, 5, 3, 5, 3, 8, 6, 8, 3, 3, 5, 8, 1, 6, 9, 5, 6, 0, 9, 9, 5, 6, 8, 9, 6, 0, 6, 3, 6, 1, 0, 6, 2, 3, 5, 1, 9, 0, 6, 6, 5, 6, 3, 4, 5, 1, 6, 7, 4, 2, 9, 6, 6, 2, 5, 8, 8, 4, 1, 7, 1, 8, 1, 1, 3, 7, 9, 5, 8, 4, 4, 1, 2, 0, 1, 4, 9, 2, 7, 5, 8, 3, 2, 3, 8, 0, 1, 3, 7, 6, 6, 4, 3, 5, 0, 6, 4, 7, 1, 7, 1, 0, 0, 8, 2, 7, 2, 7, 8, 6, 2, 9, 1, 6, 2, 6, 1, 3, 0, 5, 3, 0, 6, 1, 1, 5, 1, 7, 5, 3, 4, 1, 1, 4, 0, 8, 4, 2, 5, 4, 8, 3, 4, 3, 1, 1, 7, 9, 1, 1, 8, 0, 1, 1, 2, 1, 4, 4, 8, 7, 4, 8, 6, 3, 1, 9, 6, 6, 4, 4, 0, 2, 5, 9, 7, 1, 7, 6, 4, 7, 5, 4, 1, 0, 2, 3, 3, 8, 9, 9, 7, 5, 9, 9, 7, 9, 6, 0, 4, 5, 3, 3, 1, 5, 1, 8, 3, 8, 0, 5, 4, 8, 1, 3, 8, 9, 1, 8, 0, 0, 5, 8, 1, 2, 7, 8, 2, 9, 5, 8, 9, 9, 6, 4, 3, 9, 0, 7, 0, 2, 2, 3, 8, 3, 0, 9, 5, 6, 3, 1, 5, 2, 3, 9, 2, 6, 7, 3, 8, 3, 6, 3, 7, 3, 0, 6, 3, 3, 9, 1, 8, 8, 3, 8, 3, 3, 0, 1, 0, 0, 7, 8, 8, 0, 5, 0, 9, 1, 8, 5, 6, 3, 5, 3, 0, 2, 2, 8, 6, 2, 9, 0, 0, 1, 0, 4, 3, 3, 8, 8, 4, 0, 6, 3, 1, 6, 2, 0, 7, 5, 7, 0, 1, 6, 0, 3, 2, 6, 9, 2, 9, 4, 7, 4, 5, 8, 5, 4, 7, 7, 3, 3, 7, 8, 9, 9, 1, 0, 4, 6, 2, 7, 5, 1, 8, 0, 7, 9, 3, 4, 2, 1, 0, 2, 5, 6, 0, 3, 9, 4, 2, 1, 7, 0, 1, 5, 4, 3, 7, 1, 7, 1, 9, 7, 8, 7, 0, 7, 8, 3, 2, 8, 7, 4, 5, 7, 1, 4, 7, 4, 4, 8, 9, 9, 8, 0, 6, 2, 4, 2, 4, 7, 6, 8, 1, 7, 4, 0, 2, 9, 8, 0, 6, 1, 6, 3, 9, 2, 0, 0, 4, 9, 2, 1, 0, 2, 2, 0, 2, 3, 7, 3, 8, 6, 4, 3, 7, 1, 0, 6, 4, 5, 8, 5, 3, 3, 7, 1, 7, 5, 7, 9, 2, 3, 4, 9, 9, 8, 9, 8, 2, 5, 9, 5, 0, 6, 8, 9, 9, 6, 1, 1, 9, 1, 6, 9, 4, 2, 2, 6, 8, 7, 1, 3, 6, 1, 1, 1, 5, 7, 5, 0, 1, 5, 8, 0, 6, 4, 3, 1, 7, 8, 1, 2, 1, 2, 5, 4, 8, 2, 9, 0, 8, 3, 5, 4, 9, 3, 6, 5, 7, 0, 7, 9, 9, 2, 6, 9, 9, 3, 2, 4, 3, 5, 0, 3, 0, 5, 1, 4, 5, 1, 1, 5, 5, 7, 0, 2, 0, 5, 9, 4, 0, 3, 8, 9, 0, 9, 8, 6, 1, 2, 7, 6, 7, 0, 3, 3, 3, 0, 6, 2, 0, 7, 0, 4, 3, 7, 3, 5, 7, 7, 4, 7, 6, 1, 4, 6, 6, 6, 0, 1, 4, 7, 7, 7, 1, 7, 8, 3, 7, 3, 9, 3, 2, 1, 0, 6, 2, 7, 5, 0, 6, 7, 2, 4, 3, 2, 9, 4, 9, 8, 2, 0, 6, 1, 1, 7, 5, 0, 6, 6, 2, 3, 5, 8, 3, 5, 7, 1, 8, 2, 2, 1, 4, 6, 2, 0, 1, 7, 8, 1, 2, 0, 2, 9, 9, 3, 7, 7, 4, 2, 0, 6, 8, 5, 9, 4, 9, 2, 3, 0, 5, 3, 4, 6, 1, 1, 0, 1, 6, 9, 6, 2, 9, 5, 7, 7, 3, 0, 5, 6, 3, 2, 0, 3, 3, 4, 8, 5, 1, 6, 5, 7, 7, 8, 2, 9, 9, 7, 3, 8, 2, 8, 6, 2, 2, 1, 4, 7, 4, 4, 6, 6, 9, 7, 2, 4, 6, 0, 8, 6, 6, 7, 0, 0, 0, 8, 2, 6, 6, 1, 5, 0, 9, 5, 6, 1, 4, 0, 7, 3, 1, 7, 9, 0, 1, 6, 6, 8, 8, 3, 0, 3, 3, 1, 6, 9, 4, 8, 8, 8, 6, 6, 2, 3, 9, 3, 8, 6, 2, 2, 0, 2, 5, 6, 8, 0, 2, 2, 8, 8, 3, 3, 3, 8, 2, 6, 6, 1, 7, 2, 7, 5, 5, 3, 8, 2, 0, 8, 4, 4, 8, 4, 5, 5, 7, 6, 3, 2, 3, 8, 1, 1, 6, 9, 0, 6, 7, 2, 4, 3, 4, 6, 8, 6, 0, 8, 8, 9, 7, 2, 7, 0, 4, 2, 3, 0, 6, 1, 0, 9, 3, 9, 1, 6, 2, 1, 1, 1, 0, 0, 0, 0, 2, 3, 0, 9, 3, 3, 7, 1, 6, 7, 9, 8, 2, 8, 4, 7, 0, 4, 0, 1, 8, 2, 3, 8, 1, 9, 9, 1, 6, 7, 1, 4, 0, 3, 5, 1, 0, 4, 8, 3, 5, 9, 7, 4, 2, 9, 9, 0, 2, 1, 8, 3, 9, 3, 5, 0, 5, 2, 3, 9, 0, 3, 3, 8, 3, 2, 2, 5, 8, 2, 6, 6, 2, 2, 1, 1, 7, 4, 2, 3, 8, 1, 2, 3, 4, 0, 2, 7, 5, 1, 0, 1, 2, 3, 6, 2, 5, 1, 5, 0, 0, 1, 7, 7, 5, 5, 6, 0, 4, 0, 3, 8, 6, 9, 8, 6, 1, 0, 2, 2, 6, 1, 8, 5, 3, 1, 9, 1, 1, 8, 5, 6, 1, 4, 2, 8, 4, 2, 7, 5, 5, 8, 0, 5, 1, 9, 3, 4, 8, 0, 8, 3, 5, 6, 4, 3, 6, 4, 0, 3, 4, 5, 3, 4, 2, 5, 3, 8, 0, 5, 8, 4, 0, 8, 5, 2, 5, 7, 8, 4, 2, 9, 5, 8, 8, 3, 3, 5, 3, 4, 9, 5, 0, 6, 1, 9, 0, 0, 9, 7, 1, 8, 3, 9, 2, 1, 7, 1, 9, 6, 9, 7, 7, 0, 2, 7, 7, 9, 9, 3, 5, 2, 2, 9, 2, 5, 5, 9, 5, 8, 3, 4, 1, 2, 5, 6, 3, 8, 4, 1, 2, 2, 0, 7, 6, 7, 1, 2, 8, 3, 1, 7, 4, 5, 9, 0, 3, 7, 8, 0, 7, 4, 2, 6, 9, 0, 2, 7, 4, 7, 3, 1, 7, 5, 1, 4, 0, 2, 4, 4, 3, 3, 0, 0, 8, 3, 3, 0, 9, 1, 7, 7, 0, 6, 9, 2, 4, 8, 5, 8, 5, 8, 9, 4, 4, 4, 8, 5, 3, 7, 0, 2, 5, 9, 8, 4, 9, 4, 2, 1, 3, 0, 3, 4, 8, 0, 1, 1, 9, 8, 7, 6, 1, 6, 3, 9, 6, 0, 2, 9, 2, 9, 6, 0, 0, 8, 6, 4, 9, 1, 1, 0, 5, 0, 2, 8, 4, 5, 9, 2, 6, 7, 4, 5, 5, 7, 6, 3, 8, 7, 9, 8, 4, 4, 6, 1, 1, 2, 0, 9, 1, 7, 2, 8, 8, 2, 1, 4, 4, 8, 4, 4, 6, 9, 5, 8, 5, 5, 7, 7, 5, 9, 5, 3, 4, 9, 9, 3, 7, 6, 9, 5, 8, 6, 6, 0, 7, 9, 2, 8, 3, 7, 0, 4, 0, 8, 8, 6, 2, 1, 2, 8, 9, 7, 2, 0, 2, 7, 6, 9, 1, 4, 8, 2, 8, 6, 7, 1, 1, 0, 1, 4, 6, 0, 4, 7, 1, 6, 0, 1, 9, 9, 8, 1, 6, 9, 1, 9, 9, 0, 1, 1, 7, 1, 8, 9, 1, 0, 0, 5, 7, 4, 4, 6, 5, 2, 5, 9, 8, 6, 5, 5, 3, 7, 8, 7, 7, 6, 3, 3, 1, 5, 9, 6, 7, 7, 3, 1, 7, 3, 2, 6, 6, 9, 8, 7, 2, 6, 8, 7, 7, 5, 1, 0, 7, 1, 7, 2, 1, 3, 4, 4, 9, 6, 2, 3, 8, 8, 0, 4, 7, 2, 7, 7, 9, 3, 7, 6, 8, 3, 9, 6, 4, 7, 4, 0, 3, 8, 9, 7, 0, 0, 5, 0, 7, 8, 8, 1, 8, 2, 9, 5, 8, 9, 5, 5, 2, 4, 8, 6, 3, 7, 2, 5, 5, 0, 3, 7, 4, 8, 1, 5, 1, 1, 7, 0, 1, 6, 7, 6, 8, 4, 0, 6, 6, 4, 2, 8, 7, 6, 3, 3, 7, 2, 3, 8, 9, 8, 7, 7, 4, 8, 3, 8, 7, 9, 2, 9, 9, 1, 5, 5, 4, 0, 6, 1, 2, 6, 3, 3, 2, 0, 5, 9, 7, 7, 0, 5, 0, 9, 2, 7, 7, 0, 9, 5, 5, 1, 9, 0, 3, 3, 9, 6, 7, 4, 8, 2, 5, 8, 2, 1, 4, 9, 0, 8, 2, 4, 0, 1, 2, 3, 0, 9, 4, 8, 3, 8, 9, 2, 3, 1, 4, 5, 1, 5, 1, 0, 2, 5, 2, 1, 8, 6, 4, 5, 0, 9, 3, 1, 0, 9, 1, 0, 7, 6, 6, 7, 7, 2, 6, 9, 3, 4, 5, 1, 9, 6, 6, 4, 8, 8, 6, 0, 4, 9, 5, 9, 9, 3, 9, 9, 0, 2, 2, 7, 3, 5, 1, 0, 9, 5, 8, 0, 8, 1, 1, 0, 0, 7, 4, 8, 2, 3, 3, 2, 5, 6, 0, 1, 8, 2, 6, 6, 2, 1, 3, 6, 5, 8, 3, 2, 0, 8, 1, 7, 9, 7, 2, 0, 4, 6, 8, 1, 5, 7, 9, 7, 0, 4, 1, 7, 5, 8, 7, 4, 8, 7, 3, 7, 4, 4, 0, 4, 7, 4, 3, 5, 3, 8, 1, 7, 8, 5, 7, 0, 8, 7, 5, 5, 4, 7, 1, 9, 0, 5, 2, 6, 1, 4, 8, 0, 6, 3, 1, 9, 7, 3, 5, 6, 6, 9, 8, 0, 5, 9, 6, 2, 6, 9, 5, 8, 3, 0, 5, 1, 7, 2, 8, 0, 4, 0, 8, 1, 3, 9, 7, 1, 3, 6, 7, 4, 8, 6, 7, 5, 3, 4, 3, 5, 2, 6, 9, 5, 0, 1, 7, 4, 8, 9, 4, 2, 2, 9, 0, 3, 3, 1, 3, 0, 4, 2, 1, 4, 0, 8, 2, 1, 4, 4, 3, 6, 6, 8, 3, 9, 9, 9, 9, 6, 5, 0, 8, 2, 3, 5, 9, 8, 2, 8, 3, 4, 1, 1, 7, 6, 9, 2, 1, 4, 6, 3, 3, 2, 1, 8, 1, 0, 0, 0, 3, 4, 0, 8, 0, 9, 1, 2, 8, 0, 1, 7, 7, 3, 4, 7, 8, 0, 2, 7, 1, 3, 7, 4, 6, 1, 7, 6, 1, 2, 6, 9, 8, 2, 0, 1, 0, 9, 6, 5, 3, 2, 4, 6, 5, 4, 9, 3, 8, 8, 7, 3, 6, 1, 2, 9, 8, 8, 1, 0, 3, 0, 8, 0, 0, 6, 6, 1, 3, 3, 6, 6, 5, 7, 5, 3, 8, 2, 1, 9, 0, 4, 6, 9, 2, 3, 9, 4, 1, 4, 2, 2, 3, 4, 8, 4, 3, 0, 6, 8, 8, 6, 2, 3, 3, 7, 3, 5, 2, 9, 6, 0, 2, 3, 5, 2, 4, 9, 5, 1, 6, 0, 3, 3, 7, 3, 7, 9, 8, 1, 5, 2, 8, 0, 2, 9, 5, 6, 6, 2, 6, 7, 4, 2, 4, 5, 8, 7, 6, 1, 1, 9, 5, 9, 7, 2, 1, 2, 9, 6, 8, 0, 3, 7, 7, 7, 8, 2, 3, 9, 0, 4, 1, 6, 4, 5, 0, 6, 6, 7, 2, 6, 9, 7, 9, 6, 6, 1, 3, 2, 4, 1, 1, 0, 4, 2, 6, 0, 8, 4, 4, 9, 8, 1, 5, 8, 1, 1, 8, 8, 9, 7, 2, 4, 5, 6, 4, 9, 6, 7, 5, 0, 8, 3, 5, 4, 5, 0, 5, 0, 2, 3, 0, 3, 7, 5, 0, 2, 3, 2, 3, 5, 9, 6, 3, 3, 8, 3, 9, 1, 7, 3, 0, 2, 0, 7, 5, 1, 1, 2, 6, 6, 1, 6, 8, 0, 8, 1, 0, 7, 2, 7, 3, 2, 3, 1, 9, 5, 3, 6, 9, 2, 4, 3, 8, 3, 8, 7, 2, 4, 2, 8, 4, 4, 2, 5, 6, 3, 9, 4, 6, 7, 0, 4, 4, 1, 8, 6, 2, 7, 4, 3, 1, 0, 7, 0, 9, 5, 8, 0, 1, 6, 9, 5, 0, 0, 2, 8, 5, 4, 0, 5, 1, 3, 3, 4, 9, 5, 3, 3, 1, 0, 1, 2, 2, 3, 6, 1, 2, 7, 8, 1, 9, 0, 6, 8, 6, 0, 8, 9, 2, 3, 7, 6, 2, 9, 8, 8, 6, 3, 0, 6, 9, 5, 9, 0, 7, 2, 0, 1, 2, 4, 1, 7, 5, 5, 2, 9, 2, 0, 5, 7, 4, 7, 7, 2, 7, 6, 5, 1, 5, 9, 7, 2, 0, 8, 9, 8, 6, 8, 5, 0, 7, 7, 8, 2, 1, 6, 1, 3, 1, 6, 6, 8, 2, 3, 7, 9, 8, 3, 8, 5, 7, 0, 1, 0, 7, 4, 2, 0, 4, 9, 4, 2, 7, 7, 4, 4, 1, 1, 0, 9, 0, 9, 8, 6, 4, 7, 2, 2, 2, 6, 0, 2, 1, 0, 2, 8, 4, 4, 6, 5, 9, 0, 1, 1, 8, 5, 1, 1, 8, 9, 0, 6, 4, 8, 4, 5, 7, 1, 4, 6, 2, 2, 6, 8, 2, 9, 2, 2, 7, 1, 4, 5, 3, 1, 0, 8, 4, 4, 3, 7, 8, 9, 3, 6, 1, 2, 1, 2, 2, 7, 1, 1, 1, 2, 5, 7, 2, 2, 7, 3, 4, 4, 5, 1, 0, 2, 9, 8, 3, 9, 1, 2, 0, 5, 9, 5, 9, 3, 1, 0, 3, 3, 0, 4, 0, 8, 4, 0, 1, 7, 5, 8, 3, 6, 9, 8, 7, 2, 8, 2, 3, 4, 5, 2, 6, 7, 4, 2, 7, 5, 5, 4, 8, 8, 1, 3, 8, 5, 4, 8, 9, 6, 9, 4, 3, 0, 1, 2, 2, 4, 6, 8, 8, 5, 0, 3, 1, 8, 3, 0, 7, 9, 8, 8, 9, 5, 2, 6, 4, 6, 8, 9, 8, 4, 8, 0, 5, 7, 1, 4, 8, 8, 3, 4, 0, 0, 5, 8, 3, 9, 3, 5, 9, 9, 6, 5, 8, 6, 3, 7, 2, 4, 0, 9, 2, 1, 0, 7, 3, 9, 8, 8, 4, 7, 7, 6, 9, 5, 8, 4, 6, 2, 2, 7, 6, 3, 3, 9, 2, 7, 6, 8, 1, 1, 5, 8, 5, 4, 4, 0, 3, 6, 1, 0, 6, 2, 6, 0, 3, 4, 6, 2, 6, 1, 1, 0, 7, 6, 5, 4, 5, 7, 1, 4, 4, 4, 7, 4, 4, 1, 4, 3, 6, 6, 8, 9, 6, 7, 2, 4, 3, 5, 3, 7, 8, 6, 2, 0, 0, 0, 2, 2, 5, 7, 1, 9, 6, 1, 9, 5, 9, 0, 6, 5, 4, 3, 8, 0, 6, 7, 1, 7, 4, 9, 8, 2, 6, 7, 3, 0, 5, 6, 7, 5, 7, 1, 6, 6, 4, 3, 3, 9, 8, 4, 3, 6, 4, 1, 6, 7, 4, 0, 1, 6, 3, 1, 2, 0, 0, 8, 6, 1, 6, 3, 8, 5, 0, 9, 1, 5, 4, 4, 0, 5, 2, 6, 1, 5, 9, 0, 8, 8, 1, 4, 9, 4, 4, 1, 0, 7, 3, 9, 1, 0, 2, 3, 1, 5, 2, 6, 9, 2, 3, 0, 7, 4, 3, 3, 0, 9, 3, 8, 3, 4, 2, 2, 1, 9, 0, 2, 8, 6, 6, 0, 3, 3, 6, 5, 3, 4, 1, 2, 0, 8, 9, 4, 1, 7, 2, 6, 1, 3, 3, 0, 1, 9, 5, 4, 4, 8, 2, 6, 2, 9, 7, 7, 7, 9, 8, 9, 4, 4, 7, 1, 0, 4, 3, 6, 3, 9, 8, 3, 6, 8, 3, 6, 6, 2, 6, 7, 3, 0, 0, 0, 2, 5, 1, 2, 9, 2, 2, 1, 6, 3, 9, 1, 1, 5]\n",
      "Data:\n",
      "[[ 59  43  50 ... 140  84  72]\n",
      " [154 126 105 ... 139 142 144]\n",
      " [255 253 253 ...  83  83  84]\n",
      " ...\n",
      " [ 71  60  74 ...  68  69  68]\n",
      " [250 254 211 ... 215 255 254]\n",
      " [ 62  61  60 ... 130 130 131]]\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "使用逻辑回归",
   "id": "619c32b4942bf996"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:42.523890Z",
     "start_time": "2025-06-10T05:18:42.334001Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 准备数据进行逻辑回归训练和评估\n",
    "# CIFAR-10数据集包含10个类别，每个样本是32x32x3的彩色图像，展平后为3072维特征\n",
    "\n",
    "# 提取训练数据和标签\n",
    "batches = []\n",
    "for i in range(1, 6):\n",
    "    batch = unpickle(f\"./data/cifar-10-batches-py/data_batch_{i}\")\n",
    "    batches.append(batch)\n",
    "data = np.concatenate([batch[b\"data\"] for batch in batches], axis=0)\n",
    "labels = np.concatenate([batch[b\"labels\"] for batch in batches], axis=0)\n",
    "# 将数据分为训练集和测试集\n",
    "# 划分比例：80%训练集，20%测试集\n",
    "data_len = data.shape[0]\n",
    "train_data_len = int(data_len * 0.8)\n",
    "test_data_len = data_len - train_data_len\n",
    "# 开发时使用较小数据\n",
    "scale_factor = 0.6\n",
    "\n",
    "data = data[: int(data_len * scale_factor)]\n",
    "labels = labels[: int(data_len * scale_factor)]\n",
    "data_len = data.shape[0]\n",
    "train_data_len = int(data_len * 0.8)\n",
    "test_data_len = data_len - train_data_len\n",
    "\n",
    "print(f\"train_data_len: {train_data_len}, test_data_len: {test_data_len}\")"
   ],
   "id": "631730c37520251",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_data_len: 24000, test_data_len: 6000\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:42.541675Z",
     "start_time": "2025-06-10T05:18:42.535153Z"
    }
   },
   "cell_type": "code",
   "source": [
    "X_train = data[:train_data_len]\n",
    "y_train = labels[:train_data_len]\n",
    "X_test = data[train_data_len:]\n",
    "y_test = labels[train_data_len:]\n",
    "print(f\"X_train.shape: {X_train.shape}, y_train.shape: {y_train.shape}\")\n",
    "print(f\"X_test.shape: {X_test.shape}, y_test.shape: {y_test.shape}\")"
   ],
   "id": "55816f1b3cc40d60",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train.shape: (24000, 3072), y_train.shape: (24000,)\n",
      "X_test.shape: (6000, 3072), y_test.shape: (6000,)\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:43.080746Z",
     "start_time": "2025-06-10T05:18:42.573208Z"
    }
   },
   "cell_type": "code",
   "source": [
    "X_train_scaled = X_train.astype(\"float32\") / 255.0\n",
    "X_test_scaled = X_test.astype(\"float32\") / 255.0\n",
    "X_train_scaled = X_train.astype(\"float32\") / 255.0\n",
    "X_test_scaled = X_test.astype(\"float32\") / 255.0\n",
    "print(f\"压缩后的训练数据: {X_train_scaled.shape}\")\n",
    "print(f\"压缩后的测试数据: {X_test_scaled.shape}\")"
   ],
   "id": "f3185554b06e4a09",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "压缩后的训练数据: (24000, 3072)\n",
      "压缩后的测试数据: (6000, 3072)\n"
     ]
    }
   ],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:18:47.415937Z",
     "start_time": "2025-06-10T05:18:43.096328Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.decomposition import PCA\n",
    "\n",
    "\n",
    "def pca_transform(X_train, X_test):\n",
    "    \"\"\"\n",
    "    使用PCA对数据进行降维\n",
    "    \"\"\"\n",
    "\n",
    "    pca = PCA(n_components=100)  # 保留100个主成分\n",
    "    X_train_pca = pca.fit_transform(X_train)\n",
    "    X_test_pca = pca.transform(X_test)\n",
    "    print(f\"PCA后的训练数据形状: {X_train_pca.shape}\")\n",
    "    print(f\"PCA后的测试数据形状: {X_test_pca.shape}\")\n",
    "    return X_train_pca, X_test_pca\n",
    "\n",
    "\n",
    "X_train_pca, X_test_pca = pca_transform(X_train_scaled, X_test_scaled)"
   ],
   "id": "652938948c58a0f2",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PCA后的训练数据形状: (24000, 100)\n",
      "PCA后的测试数据形状: (6000, 100)\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:19:36.660224Z",
     "start_time": "2025-06-10T05:18:47.448806Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from skimage.feature import hog\n",
    "from skimage import exposure\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from skimage import color\n",
    "\n",
    "\n",
    "def extract_hog_features(data):\n",
    "    \"\"\"\n",
    "    对每个图像提取HOG特征\n",
    "    \"\"\"\n",
    "    hog_features = []\n",
    "    hog_images = []\n",
    "\n",
    "    for i in range(data.shape[0]):\n",
    "        # 重塑为32x32的图像 (CIFAR-10图像尺寸)\n",
    "        image = data[i].reshape(32, 32, 3)\n",
    "        # 转换为灰度图像\n",
    "        image = color.rgb2gray(image)\n",
    "\n",
    "        # 提取HOG特征\n",
    "        features, hog_image = hog(\n",
    "            image,\n",
    "            orientations=9,  # 方向数量\n",
    "            pixels_per_cell=(8, 8),  # 每个cell的像素数\n",
    "            cells_per_block=(4, 4),  # 每个block的cell数\n",
    "            visualize=True,  # 返回可视化图像\n",
    "            feature_vector=True,\n",
    "        )  # 返回特征向量\n",
    "\n",
    "        hog_features.append(features)\n",
    "        hog_images.append(hog_image)\n",
    "\n",
    "    return np.array(hog_features), np.array(hog_images)\n",
    "\n",
    "\n",
    "# 对训练集和测试集提取HOG特征\n",
    "print(\"正在提取训练集HOG特征...\")\n",
    "X_train_hog, X_train_hog_images = extract_hog_features(X_train)\n",
    "\n",
    "print(\"正在提取测试集HOG特征...\")\n",
    "X_test_hog, X_test_hog_images = extract_hog_features(X_test)"
   ],
   "id": "748a943203ffa91b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "正在提取训练集HOG特征...\n",
      "正在提取测试集HOG特征...\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:19:36.681363Z",
     "start_time": "2025-06-10T05:19:36.675728Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(f\"X_train_hog.shape: {X_train_hog.shape}, X_test_hog.shape: {X_test_hog.shape}\")\n",
    "print(\n",
    "    f\"X_train_hog_images.shape: {X_train_hog_images.shape}, X_test_hog_images.shape: {X_test_hog_images.shape}\"\n",
    ")"
   ],
   "id": "8c8af9a63adeb5ed",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train_hog.shape: (24000, 144), X_test_hog.shape: (6000, 144)\n",
      "X_train_hog_images.shape: (24000, 32, 32), X_test_hog_images.shape: (6000, 32, 32)\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:19:37.016218Z",
     "start_time": "2025-06-10T05:19:36.707094Z"
    }
   },
   "cell_type": "code",
   "source": [
    "image_origin = X_test[0].reshape(3, 32, 32).transpose(1, 2, 0)\n",
    "image_now = X_test_hog_images[0].reshape(32, 32)\n",
    "image_now = exposure.rescale_intensity(image_now, in_range=(0, 10), out_range=(0, 255))\n",
    "image_now = image_now.astype(np.uint8)\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.title(\"原图\")\n",
    "plt.axis(\"off\")\n",
    "plt.imshow(image_origin)\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.title(\"HOG特征\")\n",
    "plt.axis(\"off\")\n",
    "plt.imshow(image_now)"
   ],
   "id": "10f47e1b9c92f929",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x1b13737eab0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAELCAYAAABEYIWnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAmXklEQVR4nO3deZDddZ3u8eesfXrvdPY9hDWGJSKhDTIOghSjVTg6TlnOoISldADHsRwvVwSmyilAGEcBYQYMzAwgEZkRyzhQ6FyEKrnxsiQXhQtZICH70lt67z77uX/kpi9teH5pGpp05/t+/aP2k3PO73fOafj4y3nOJ1apVCoCAADBih/tAwAAAEcXwwAAAIFjGAAAIHAMAwAABI5hAACAwDEMAAAQOIYBAAACxzAAAEDgGAYAAG9r//79+sAHPqBXX331sOzee+/V5z//+SPex6OPPqqf/exnKpVK43GIeI8kj/YB4J2rVCqj/sWqVCrK5/Oqra2VJA0MDLzjX8pUKqXq6up3fJwAJrd0Oq1SqaS6ujpJUqlUUrlcViqVUk1NjZLJg/8KKZfLyuVyymQyisViw7dvb2/X7bffrpNOOkkXX3yxNm3apKqqqhF/5q3y+bwWLlyompqa8T85jMAwMAk99thjuvHGG9/RbV555RVVVVXp6quv1gsvvPCObnvRRRfprrvueke3ATA+XnjhBV166aV67LHHdNpppw3//OSTT9a3vvUtXXbZZfr1r3+tO+64Qzt37tTixYv1rW99Sx/+8IeH/2x/f79uuukmPfXUU8pkMrrkkkv0la98ZThfs2aN1q1bp29+85uSpEwmM/zYl19++YjjOfnkk4f/+9NPP6158+ZJOjg4XHfddaqurtYPfvADxeNxfe5zn1M6nVYikVC5XNbAwIBqamqG/3ehUNBPfvITnXrqqe/9E4dIDAOTUCqVUn19vX7zm9+M+PmaNWvU1tamL3/5y8M/O3RloKqqSpKUTCZ1xRVXDP+SS9LPf/5zzZo1SytWrDjssW644QZls9lxOhMA77WXXnpJf/M3f6NPfOITuu666/TII4/oqquu0n/+539qwYIFkqRrr71WO3bs0J133qkdO3boH/7hHzR37lx9+tOfliRt3LhRHR0dh933mWeeqd/+9rdKp9P6j//4Dz399NNatWqVKpWKcrmcmpubJR0cBG688UatW7dOq1ev1tSpUyVJr7322vB97d69WxdccIHuv/9+nXXWWeP8rOBIGAYmoUOX2A5d+j/kmWee0WmnnXbYz9/q0GW9Qzo7O3XzzTfrvPPO09KlS4d/nk6nh//fQCKReK8OHcA4e+CBB7R48WJ973vfUywWU0tLi8477zytXr1a119/vTZs2KBnnnlGP/7xj4f/JfzKK6/ooYceGh4GtmzZov7+ft13332SpH/5l3/RvHnzdNlllw3/cyGTySiZTKqhoeGwY3j44Yf185//XN/97nc1b9483XTTTfr6178+/NcNmHgYBia5O+64Qz/84Q+H//fatWt17733jvgzzz333PDE/ofDwM0336z+/n498cQTeuKJJ4Z/fuedd+oTn/iEJCke53OmwGTx4osv6jOf+czw/2lIp9M666yztH79eknSs88+q9raWn3oQx8avs3SpUv1q1/9SpVKRbFYTBs3blRzc7Oee+45SdK6devU0dExfLUgnU4rm82qWCyqt7dX0sGrAUNDQ5ozZ46+8IUvaP78+brgggt0yy236N///d918cUXa9myZe/jM4F3gmFgkkun0zr77LP18MMPH5Yd+rvFdDr9trf90Y9+pCeffFLnnHOO7rvvPqVSKX3lK19RLBYbHgQATB79/f3q7u7WnDlzRvx89uzZev755yUd/H/9c+fOHfEhvj/7sz/TOeeco0qlol27dqmzs1OPP/64UqmUli9frlWrVmnWrFm67LLLhgeEQ5YvXz783xOJhDZs2KBkMqkLLrhAv/vd7/TjH/9YN910k5YtW6YNGzbojTfe0J/+6Z8eduz5fF75fJ6rB0cJw8Ak5z6Ve6Q/s3PnTt1xxx36/ve/r5/85Ce66qqrNGfOHO3bt08/+tGPxuNQAbyH/vzP//ywnx36K70/bP9UV1drYGBAktTV1XXYv3AbGhqGL/dXKhWtXLlSU6dOHf5//YesWrVKyWRyxF8drl69Wv/1X/+lhx56aMTni/bv36+vf/3rmjNnjj772c9KOnhVYvXq1SOGgUsuuWT4v9fX1w9fwcD7i2Fgknrrv+BffPHFEZ/oHY0FCxbo17/+taZOnapYLKZvfOMbqlQquuGGG+yVBAATx/e+9z2dcMIJw//70N/3v51Dl/8lqVgsDv/V37PPPqsvfelLw39u8+bNWrhwoa6//voRt3/44Ye1e/du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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:19:50.377567Z",
     "start_time": "2025-06-10T05:19:37.028236Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def extract_color_histogram_features(data):\n",
    "    \"\"\"\n",
    "    对每个图像提取颜色直方图特征\n",
    "    \"\"\"\n",
    "    hist_features = []\n",
    "\n",
    "    for i in range(data.shape[0]):\n",
    "        # 重塑为32x32x3的图像 (CIFAR-10图像尺寸)\n",
    "        image = data[i].reshape(32, 32, 3)\n",
    "\n",
    "        # 分别计算RGB三个通道的直方图\n",
    "        hist_r = np.histogram(image[:, :, 0], bins=128, range=(0, 255))[0]\n",
    "        hist_g = np.histogram(image[:, :, 1], bins=128, range=(0, 255))[0]\n",
    "        hist_b = np.histogram(image[:, :, 2], bins=128, range=(0, 255))[0]\n",
    "\n",
    "        # 连接三个通道的直方图作为特征\n",
    "        hist_feature = np.concatenate([hist_r, hist_g, hist_b])\n",
    "\n",
    "        # 归一化特征\n",
    "        hist_feature = hist_feature / np.sum(hist_feature)\n",
    "\n",
    "        hist_features.append(hist_feature)\n",
    "\n",
    "    return np.array(hist_features)\n",
    "\n",
    "\n",
    "# 对训练集和测试集提取颜色直方图特征\n",
    "print(\"正在提取训练集颜色直方图特征...\")\n",
    "X_train_color = extract_color_histogram_features(X_train)\n",
    "\n",
    "print(\"正在提取测试集颜色直方图特征...\")\n",
    "X_test_color = extract_color_histogram_features(X_test)\n",
    "\n",
    "print(\n",
    "    f\"X_train_color.shape: {X_train_color.shape}, X_test_color.shape: {X_test_color.shape}\"\n",
    ")"
   ],
   "id": "16a06f17541fc616",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "正在提取训练集颜色直方图特征...\n",
      "正在提取测试集颜色直方图特征...\n",
      "X_train_color.shape: (24000, 384), X_test_color.shape: (6000, 384)\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:19:50.417216Z",
     "start_time": "2025-06-10T05:19:50.406762Z"
    }
   },
   "cell_type": "code",
   "source": [
    "classifiers = {\n",
    "    \"Logistic Regression\": {\n",
    "        \"model\": LogisticRegression(random_state=42),\n",
    "        \"params\": {\"C\": [0.01, 0.05, 0.1], \"max_iter\": [2000]},\n",
    "    },\n",
    "    \"SVM\": {\n",
    "        \"model\": SVC(random_state=42),\n",
    "        \"params\": {\"C\": [0.01, 0.05, 0.1], \"kernel\": [\"linear\", \"rbf\"]},\n",
    "    },\n",
    "    \"Decision Tree\": {\n",
    "        \"model\": DecisionTreeClassifier(random_state=42),\n",
    "        \"params\": {\n",
    "            \"max_depth\": [None, 30, 50, 200],\n",
    "            \"min_samples_split\": [2, 5, 10, 20],\n",
    "        },\n",
    "    },\n",
    "    \"Random Forest\": {\n",
    "        \"model\": RandomForestClassifier(random_state=42),\n",
    "        \"params\": {\"n_estimators\": [100, 1000], \"max_depth\": [None, 30, 50, 200]},\n",
    "    },\n",
    "    \"KNN\": {\n",
    "        \"model\": KNeighborsClassifier(),\n",
    "        \"params\": {\"n_neighbors\": [10, 20], \"weights\": [\"uniform\", \"distance\"]},\n",
    "    },\n",
    "    \"Naive Bayes\": {\"model\": GaussianNB(), \"params\": {}},\n",
    "}"
   ],
   "id": "e256f2af1c173c33",
   "outputs": [],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:24:31.374505Z",
     "start_time": "2025-06-10T05:19:50.447680Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def train_and_evaluate_classifiers(X_train, y_train, X_test, y_test, classifiers):\n",
    "    \"\"\"\n",
    "    训练和评估多个分类器\n",
    "\n",
    "    参数:\n",
    "    X_train: 训练集特征\n",
    "    y_train: 训练集标签\n",
    "    X_test: 测试集特征\n",
    "    y_test: 测试集标签\n",
    "    classifiers: 分类器字典\n",
    "\n",
    "    返回:\n",
    "    best_models, best_scores, cv_scores, training_times: 各分类器的结果\n",
    "    \"\"\"\n",
    "    # 存储每个分类器的最佳模型和分数\n",
    "    best_models = {}\n",
    "    best_scores = {}\n",
    "    cv_scores = {}\n",
    "    training_times = {}\n",
    "\n",
    "    # 循环每个分类器，进行训练和评估\n",
    "    for name, clf in classifiers.items():\n",
    "        print(f\"\\n正在训练 {name}...\")\n",
    "        start_time = time.time()\n",
    "\n",
    "        # 使用GridSearchCV找到最佳参数\n",
    "        if clf[\"params\"]:\n",
    "            grid_search = GridSearchCV(\n",
    "                clf[\"model\"], clf[\"params\"], cv=3, n_jobs=-1, scoring=\"accuracy\"\n",
    "            )\n",
    "            grid_search.fit(X_train, y_train)\n",
    "            best_model = grid_search.best_estimator_\n",
    "            best_params = grid_search.best_params_\n",
    "            print(f\"最佳参数: {best_params}\")\n",
    "        else:\n",
    "            best_model = clf[\"model\"]\n",
    "            best_model.fit(X_train, y_train)\n",
    "\n",
    "        # 记录训练时间\n",
    "        training_times[name] = time.time() - start_time\n",
    "\n",
    "        # 计算训练集和测试集的准确率\n",
    "        train_pred = best_model.predict(X_train)\n",
    "        train_accuracy = accuracy_score(y_train, train_pred)\n",
    "\n",
    "        test_pred = best_model.predict(X_test)\n",
    "        test_accuracy = accuracy_score(y_test, test_pred)\n",
    "\n",
    "        # 保存最佳模型和分数\n",
    "        best_models[name] = best_model\n",
    "        best_scores[name] = test_accuracy\n",
    "\n",
    "        # 使用交叉验证评估模型\n",
    "        cv_score = cross_val_score(\n",
    "            best_model, X_train, y_train, cv=5, scoring=\"accuracy\"\n",
    "        )\n",
    "        cv_scores[name] = np.mean(cv_score)\n",
    "\n",
    "        print(f\"训练集准确率: {train_accuracy:.4f}\")\n",
    "        print(f\"测试集准确率: {test_accuracy:.4f}\")\n",
    "        print(f\"交叉验证准确率: {np.mean(cv_score):.4f} ± {np.std(cv_score):.4f}\")\n",
    "        print(f\"训练时间: {training_times[name]:.2f} 秒\")\n",
    "\n",
    "        # 计算并绘制混淆矩阵\n",
    "        plt.figure(figsize=(10, 8))\n",
    "        cm = confusion_matrix(y_test, test_pred)\n",
    "        sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\")\n",
    "        plt.title(f\"{name} 混淆矩阵\")\n",
    "        plt.xlabel(\"预测标签\")\n",
    "        plt.ylabel(\"真实标签\")\n",
    "        plt.show()\n",
    "\n",
    "    return best_models, best_scores, cv_scores, training_times\n",
    "\n",
    "\n",
    "# 调用函数进行训练和评估\n",
    "best_models, best_scores, cv_scores, training_times = train_and_evaluate_classifiers(\n",
    "    X_train_pca, y_train, X_test_pca, y_test, classifiers\n",
    ")"
   ],
   "id": "5a82a394f5c7cfa8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "正在训练 Logistic Regression...\n",
      "最佳参数: {'C': 0.01, 'max_iter': 2000}\n",
      "训练集准确率: 0.4096\n",
      "测试集准确率: 0.3963\n",
      "交叉验证准确率: 0.3937 ± 0.0032\n",
      "训练时间: 6.93 秒\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x800 with 2 Axes>"
      ],
      "image/png": "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gUGB7Ni+lZat2rDs6yVUqFgZizQ4BE+Sj1mMQZMHvLy8cHd3p2bNmvHWhYWFcfr06SRPhr7xKPifN0qD7O3S3nCBxJh10uOfN0qDupaLP6ntbRASkXaG+yWFbXpDftsx3NVHKTshc2Cb6oxYtJFsOWMnQF+9cJp1s8ZjaZ0OczMzeoyfS26n/PGut3B0X+p/0IVCJd9NkVyuOTKlyO2+6bK/pd9j6a1e3076OyVd2XvgiGkC9PFjRxg6ZCDp06XDzNycZSvW4PKahmfZvMG/LboMjH+OltfBfcabfw4kw4qGlKCi4e2iouHtoqLh7ZLSRcPL+Pv8jrfHLZyLFCejnTHDNFQ0vF1eZ9HwMr/99oxfr12jdJkyZHmNvUpvctFQaJAxRcOd6W9+0fB2fhuJiIj8Taas9hQvm/pPUCmSWNmz56B6jZpGx5BUQkWDiIiIiAiaCJ2Q1HlMSBEREREReW1UNIiIiIiISII0PElEREREBNDopFdTT4OIiIiIiCRIPQ0iIiIiImgidELU0yAiIiIiIglST4OIiIiICJrTkBD1NIiIiIiISIJUNIiIiIiISII0PElEREREBDA31/ikV1FPg4iIiIiIJEg9DSIiIiIiaCJ0QtTTICIiIiIiCVLRICIiIiIiCdLwJBERERERdEbohKinQUREREREEqSeBhERERERNBE6IeppEBERERGRBKmnQUREREQEzWlIiHoaREREREQkQSoaREREREQkQRqeJCIiIiKChiclRD0NIiIiIiKSoDTV02BvZ210BEOERUQbHcEQXco6GR3BEBt+eWB0BEP0qlzA6AiG2PvrI6MjGKKofSajIxgivZV+y3ubPA8KNzqCIfJmeXP319TR8Gr6dBIRERERkQSpaBARERERkQSlqeFJIiIiIiL/liZCv5p6GkREREREJEHqaRARERERQROhE6KeBhERERERSZB6GkRERERE0JyGhKinQUREREREEqSiQUREREREEqThSSIiIiIiaCJ0QtTTICIiIiIiCVJPg4iIiIgImgidEPU0iIiIiIhIglQ0iIiIiIhIgjQ8SUREREQETYROiHoaREREREQkQeppEBERERFBE6ETop4GERERERFJkHoaRERERETQnIaEqKdBREREREQSpKJBREREREQSpOFJIiIiIiJoInRC1NMgIiIiIiIJUtEgiRYY4M/1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JStzFixh764dtG7eiPXr1jB52ixyv3CEvLeV5jS8mlnMy057mUo9DUibRzT5J9aWhtd+hjjv+fyfN0qDiufObHQEQ0w/6WF0BEMMrelidARDXPR6/e9vf5/f8fa4hXOR4mS0M+Z9ljujjSH3a7TieVN3EfZvRaWdXbAksUv35u63fPztFUPud3WnN/+Q1ol+1cLDw5kwIe441vv379O/f/+XbisiIpKaZMpqT/GylQwrGERE3mSJLhqsrKw4cuRInLbbt28TERH31/3IyEjee++95EknIiIiIvKa6IzQr5boosHMzAx/f38aNGjAxYsXAThx4gSNGjXiyZMnPHnyBIg9bNefR2IQEREREZHUL1F79yEhIezZswcbGxsWLFhAoUKFCAgI4MyZM/j6+hIQEMDkyZNp3LgxrVu3fiuOcSwiIiIiaUtqmZRshET1NDx48ID58+cTFhZmKghWrFhBx44dOXXqFB07dmTfvn0ULlyY0aNHv/GHThURERERkcRLVNFQqFAhDh06xGeffUbnzp05evQop06donPnzqRLlw4AR0dHOnfuzO7duzU8SUREREQkDUn0nIYnT54QGBjIwoULGTRoEL1798ba2hqACxcu0KFDBypVqsStW7dSLKyIiIiISEoxM2hJDRJdNISEhHDhwgUKFixI7969mTBhAoGBgcTExJAnTx4GDBjA2bNnKVGiRErmFRERERGR1yzR44iCgoK4c+cO1atX5/Dhw3h5efHVV18RHByMo6MjDg4OHD16lIIFC6ZkXhERERGRFGGuidCvlKiehnPnztG9e3ccHBw4cuQIWbJkYcCAARw4cIDu3bsTERFB06ZN2bp1K0FBQSmdWUREREREXqNEFQ1ly5ZlwIABPH36lA0bNgCQKVMm2rVrx+PHj7GysmLVqlUsWrSIUqVK6ehJIiIiIpLqmJkZs6QGiSoaLC0t6dChA+vXr2ft2rXs27cPgDp16rBnzx6CgoLIkSMHANHR0YSGhqZcYhERERERea2SdGzUggULMnv2bAoUKADAO++8Q7du3UxHUQIwNzfnypUryZtSREREREQMk+QTKpQtW9b0fwsLC7p37266HBwcTIYMGbCwsEiedCIiIiIir4nOCP1qiT7kanR0NBcuXDD9v0aNGqZ1YWFhzJo1i1q1avH06dPkTykiIiIiIoZJUtHw6aefxl7J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9/eHWCxGUFCQUh9bJFP26eIEdCryL6EjCKJ2JeW1njRJSb3iObouJ09r3rKfpFQJ5f1aokmk0uL5fIvFRfznPhXRnj3ypynbyFvoCIKIPr1U6AiCsDT99LH76vLodaYgj2tnXlIpf+fVq1e4c+cOnJ2dUaaMcs/szk4DEREREZEWKFeuHFq2bKmSv82igYiIiIgIEOzkbpqgeI7vICIiIiKij8aigYiIiIiIFOLwJCIiIiIiCHdGaE3ATgMRERERESnETgMREREREYr+yd2ExE4DEREREREpxKKBiIiIiIgU4vAkIiIiIiLwNA2KsNNAREREREQKsdNARERERAROhFaEnQYiIiIiIlKInQYiIiIiIgCc1fBhIplMJhM6hLI8fJEhdARBXIn/S+gIgnCvXUnoCILIypEKHUEQJfWLZ2M0N09rPqI/SU5e8XydS4vnZiM9O0/oCIKo/sOvQkcQREbIEKEjfFB8YrYgj2tVRl+Qx/0UxXMvTEREREREH43Dk4iIiIiIwInQirDTQERERERECrHTQEREREQEToNWhJ0GIiIiIiJSiEUDEREREREpxOFJRERERETgRGhF2GkgIiIiIiKF2GkgIiIiIgIg4lToD2KngYiIiIiIFGKngYiIiIgI4DFXFWCngYiIiIiIFGLRQERERERECnF4EhERERERODpJEXYaiIiIiIhIIXYaiIiIiIjAk7spwk4DEREREREpxKKBiIiIiIgU4vAkIiIiIiLwjNCKsNNAREREREQKsdNARERERATwmKsKsNNAREREREQKsdNARERERAQ2GhRhp4GIiIiIiBRi0UBERERERAqxaPhEgSsWomuLuvLLD193K7TOjPEjcOLwPgHSKV96SjJWjhmApFfPP2r5jTNHsGbiECwc2h3BAXORnpKszrgqkZiYiK4d2+BpQvx7bx/pNRT7w0LUnEq1zp05CY9u7dHMpTa+6dcTj2KiC60zduSPOLg/VIB0qpWYmIguHQo/3x9ari2SEhPRo1NbPE1IkC8LC9mDLu1boZlrPQwb8g3i4+METKh8586cQu9uHdDcpQ6+7der0Ov85xVLMGHMCIHSqc75M6fQp0cHuLnWweD+vfAoNn+7D+4PxaC+PdCxZWPMnDIeSUmJAidVnSnjvHDsYMH9dG5uDn4c2As3f78qUCrl6epig7ur+yB1z3eIWOIO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TU3ly+fPmIiefQfCpbHmHm60pL4OQqa0x4Erj7H/8iOULpn/VS8tM3+/1b6uFYJOP3jvfSf1rouQS7G4GfvXe2+n4k3tRYOHhwcqVqyIffv2ISIiAg0aNMCQIQWreWNjY3XH+iit2nfB49ho/DTdF2KxDlq264xvfxyNkgYGBdYzMDCAsakpTEzLCJRUOBmSVFw8sAv9Jy0QOorKVHjbJXunlEEpmJqWQZky2vF8X4n4DbEx0YiNica+0D3y5SEHjqOiZSX5dYNS+dttqiXbTQW1btsesTHR2LFtK16/eg37qlWxaGkAdPX0hI6mFJcjLspf5/tD98qXBx84hiUr1yBg2WKsXOoPM/NymLtgSYEjC2myKxEX8SgmGo9iohH+j+3es/8YShsaYnvQL1iyMlDAhKpRrnzBz22DUqVgYlIG1ZwKDoXW1y+BsmbmMDQqmt9DPkZb50qoYVMGNWzKYEj76vLljsN24WVyBlyqlcPItYXPs1PFwgieze3RYGywOuMWOZzT8GEimSYctugjPXyRIXQEQVyJL56/CLjXrvTfK2mhrBztGR7yKUrqa+6he7/E+4YQFAc5ecXzda5Fo78+SXp23n+vpIWq//Cr0BEEkRFSdId+JWUI81o0NSj6wwGL516YiIiIiIg+mtqHJxERERERFUWacnZmIbDTQERERERECrHTQEREREQEToRWhJ0GIiIiIiJSiEUDEREREREpxOFJREREREQAp0ErwE4DEREREREpxE4DERERERHAVoMC7DQQEREREZFC7DQQEREREYEnd1OEnQYiIiIiIlKIRQMRERERESnE4UlEREREROAZoRVhp4GIiIiIiBRip4GIiIiICDziqiLsNBARERERkUIsGoiIiIiISCEOTyIiIiIiAjg+SQF2GoiIiIiISCF2GoiIiIiIwDNCK8JOAxERERERKcSigYiIiIiIFOLwJCIiIiIi8IzQirDTQEREREREColkMplM6BBERERERFR0sdNAREREREQKsWggIiIiIiKFWDQQEREREZFCLBqIiIiIiEghFg1ERERERKQQiwYiIiIiIlKIRQMRERERESnEooGIiIiIiBRi0UBEHyUlJQU3b95EcnKy0FGIiIhIzVg00Gd78+YNWrdujfj4eKGjqM2JEyfQpk0b1KhRAz169EB0dLTQkdTi8OHDaN26NaZNmwY3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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "正在训练 SVM...\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mKeyboardInterrupt\u001B[0m                         Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[14], line 77\u001B[0m\n\u001B[0;32m     73\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m best_models, best_scores, cv_scores, training_times\n\u001B[0;32m     76\u001B[0m \u001B[38;5;66;03m# 调用函数进行训练和评估\u001B[39;00m\n\u001B[1;32m---> 77\u001B[0m best_models, best_scores, cv_scores, training_times \u001B[38;5;241m=\u001B[39m \u001B[43mtrain_and_evaluate_classifiers\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m     78\u001B[0m \u001B[43m    \u001B[49m\u001B[43mX_train_pca\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my_train\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mX_test_pca\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my_test\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mclassifiers\u001B[49m\n\u001B[0;32m     79\u001B[0m \u001B[43m)\u001B[49m\n",
      "Cell \u001B[1;32mIn[14], line 31\u001B[0m, in \u001B[0;36mtrain_and_evaluate_classifiers\u001B[1;34m(X_train, y_train, X_test, y_test, classifiers)\u001B[0m\n\u001B[0;32m     27\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m clf[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mparams\u001B[39m\u001B[38;5;124m\"\u001B[39m]:\n\u001B[0;32m     28\u001B[0m     grid_search \u001B[38;5;241m=\u001B[39m GridSearchCV(\n\u001B[0;32m     29\u001B[0m         clf[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmodel\u001B[39m\u001B[38;5;124m\"\u001B[39m], clf[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mparams\u001B[39m\u001B[38;5;124m\"\u001B[39m], cv\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m3\u001B[39m, n_jobs\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m, scoring\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124maccuracy\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m     30\u001B[0m     )\n\u001B[1;32m---> 31\u001B[0m     \u001B[43mgrid_search\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX_train\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my_train\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m     32\u001B[0m     best_model \u001B[38;5;241m=\u001B[39m grid_search\u001B[38;5;241m.\u001B[39mbest_estimator_\n\u001B[0;32m     33\u001B[0m     best_params \u001B[38;5;241m=\u001B[39m grid_search\u001B[38;5;241m.\u001B[39mbest_params_\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\sklearn\\base.py:1389\u001B[0m, in \u001B[0;36m_fit_context.<locals>.decorator.<locals>.wrapper\u001B[1;34m(estimator, *args, **kwargs)\u001B[0m\n\u001B[0;32m   1382\u001B[0m     estimator\u001B[38;5;241m.\u001B[39m_validate_params()\n\u001B[0;32m   1384\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m config_context(\n\u001B[0;32m   1385\u001B[0m     skip_parameter_validation\u001B[38;5;241m=\u001B[39m(\n\u001B[0;32m   1386\u001B[0m         prefer_skip_nested_validation \u001B[38;5;129;01mor\u001B[39;00m global_skip_validation\n\u001B[0;32m   1387\u001B[0m     )\n\u001B[0;32m   1388\u001B[0m ):\n\u001B[1;32m-> 1389\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfit_method\u001B[49m\u001B[43m(\u001B[49m\u001B[43mestimator\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1023\u001B[0m, in \u001B[0;36mBaseSearchCV.fit\u001B[1;34m(self, X, y, **params)\u001B[0m\n\u001B[0;32m   1017\u001B[0m     results \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_format_results(\n\u001B[0;32m   1018\u001B[0m         all_candidate_params, n_splits, all_out, all_more_results\n\u001B[0;32m   1019\u001B[0m     )\n\u001B[0;32m   1021\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m results\n\u001B[1;32m-> 1023\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_run_search\u001B[49m\u001B[43m(\u001B[49m\u001B[43mevaluate_candidates\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1025\u001B[0m \u001B[38;5;66;03m# multimetric is determined here because in the case of a callable\u001B[39;00m\n\u001B[0;32m   1026\u001B[0m \u001B[38;5;66;03m# self.scoring the return type is only known after calling\u001B[39;00m\n\u001B[0;32m   1027\u001B[0m first_test_score \u001B[38;5;241m=\u001B[39m all_out[\u001B[38;5;241m0\u001B[39m][\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtest_scores\u001B[39m\u001B[38;5;124m\"\u001B[39m]\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1570\u001B[0m, in \u001B[0;36mGridSearchCV._run_search\u001B[1;34m(self, evaluate_candidates)\u001B[0m\n\u001B[0;32m   1568\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_run_search\u001B[39m(\u001B[38;5;28mself\u001B[39m, evaluate_candidates):\n\u001B[0;32m   1569\u001B[0m \u001B[38;5;250m    \u001B[39m\u001B[38;5;124;03m\"\"\"Search all candidates in param_grid\"\"\"\u001B[39;00m\n\u001B[1;32m-> 1570\u001B[0m     \u001B[43mevaluate_candidates\u001B[49m\u001B[43m(\u001B[49m\u001B[43mParameterGrid\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mparam_grid\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:969\u001B[0m, in \u001B[0;36mBaseSearchCV.fit.<locals>.evaluate_candidates\u001B[1;34m(candidate_params, cv, more_results)\u001B[0m\n\u001B[0;32m    961\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mverbose \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m    962\u001B[0m     \u001B[38;5;28mprint\u001B[39m(\n\u001B[0;32m    963\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mFitting \u001B[39m\u001B[38;5;132;01m{0}\u001B[39;00m\u001B[38;5;124m folds for each of \u001B[39m\u001B[38;5;132;01m{1}\u001B[39;00m\u001B[38;5;124m candidates,\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    964\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m totalling \u001B[39m\u001B[38;5;132;01m{2}\u001B[39;00m\u001B[38;5;124m fits\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(\n\u001B[0;32m    965\u001B[0m             n_splits, n_candidates, n_candidates \u001B[38;5;241m*\u001B[39m n_splits\n\u001B[0;32m    966\u001B[0m         )\n\u001B[0;32m    967\u001B[0m     )\n\u001B[1;32m--> 969\u001B[0m out \u001B[38;5;241m=\u001B[39m \u001B[43mparallel\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    970\u001B[0m \u001B[43m    \u001B[49m\u001B[43mdelayed\u001B[49m\u001B[43m(\u001B[49m\u001B[43m_fit_and_score\u001B[49m\u001B[43m)\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    971\u001B[0m \u001B[43m        \u001B[49m\u001B[43mclone\u001B[49m\u001B[43m(\u001B[49m\u001B[43mbase_estimator\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    972\u001B[0m \u001B[43m        \u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    973\u001B[0m \u001B[43m        \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    974\u001B[0m \u001B[43m        \u001B[49m\u001B[43mtrain\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtrain\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    975\u001B[0m \u001B[43m        \u001B[49m\u001B[43mtest\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtest\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    976\u001B[0m \u001B[43m        \u001B[49m\u001B[43mparameters\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mparameters\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    977\u001B[0m \u001B[43m        \u001B[49m\u001B[43msplit_progress\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43msplit_idx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mn_splits\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    978\u001B[0m \u001B[43m        \u001B[49m\u001B[43mcandidate_progress\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43mcand_idx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mn_candidates\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    979\u001B[0m \u001B[43m        \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mfit_and_score_kwargs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    980\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    981\u001B[0m \u001B[43m    \u001B[49m\u001B[38;5;28;43;01mfor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43m(\u001B[49m\u001B[43mcand_idx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mparameters\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m(\u001B[49m\u001B[43msplit_idx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m(\u001B[49m\u001B[43mtrain\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtest\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01min\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mproduct\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    982\u001B[0m \u001B[43m        \u001B[49m\u001B[38;5;28;43menumerate\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43mcandidate_params\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    983\u001B[0m \u001B[43m        \u001B[49m\u001B[38;5;28;43menumerate\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43mcv\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msplit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mrouted_params\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msplitter\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msplit\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    984\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    985\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    987\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(out) \u001B[38;5;241m<\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[0;32m    988\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\n\u001B[0;32m    989\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mNo fits were performed. \u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    990\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mWas the CV iterator empty? \u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    991\u001B[0m         \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mWere there no candidates?\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    992\u001B[0m     )\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\sklearn\\utils\\parallel.py:77\u001B[0m, in \u001B[0;36mParallel.__call__\u001B[1;34m(self, iterable)\u001B[0m\n\u001B[0;32m     72\u001B[0m config \u001B[38;5;241m=\u001B[39m get_config()\n\u001B[0;32m     73\u001B[0m iterable_with_config \u001B[38;5;241m=\u001B[39m (\n\u001B[0;32m     74\u001B[0m     (_with_config(delayed_func, config), args, kwargs)\n\u001B[0;32m     75\u001B[0m     \u001B[38;5;28;01mfor\u001B[39;00m delayed_func, args, kwargs \u001B[38;5;129;01min\u001B[39;00m iterable\n\u001B[0;32m     76\u001B[0m )\n\u001B[1;32m---> 77\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43msuper\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[38;5;21;43m__call__\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43miterable_with_config\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\joblib\\parallel.py:2007\u001B[0m, in \u001B[0;36mParallel.__call__\u001B[1;34m(self, iterable)\u001B[0m\n\u001B[0;32m   2001\u001B[0m \u001B[38;5;66;03m# The first item from the output is blank, but it makes the interpreter\u001B[39;00m\n\u001B[0;32m   2002\u001B[0m \u001B[38;5;66;03m# progress until it enters the Try/Except block of the generator and\u001B[39;00m\n\u001B[0;32m   2003\u001B[0m \u001B[38;5;66;03m# reaches the first `yield` statement. This starts the asynchronous\u001B[39;00m\n\u001B[0;32m   2004\u001B[0m \u001B[38;5;66;03m# dispatch of the tasks to the workers.\u001B[39;00m\n\u001B[0;32m   2005\u001B[0m \u001B[38;5;28mnext\u001B[39m(output)\n\u001B[1;32m-> 2007\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m output \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mreturn_generator \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28;43mlist\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43moutput\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\joblib\\parallel.py:1650\u001B[0m, in \u001B[0;36mParallel._get_outputs\u001B[1;34m(self, iterator, pre_dispatch)\u001B[0m\n\u001B[0;32m   1647\u001B[0m     \u001B[38;5;28;01myield\u001B[39;00m\n\u001B[0;32m   1649\u001B[0m     \u001B[38;5;28;01mwith\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_backend\u001B[38;5;241m.\u001B[39mretrieval_context():\n\u001B[1;32m-> 1650\u001B[0m         \u001B[38;5;28;01myield from\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_retrieve()\n\u001B[0;32m   1652\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mGeneratorExit\u001B[39;00m:\n\u001B[0;32m   1653\u001B[0m     \u001B[38;5;66;03m# The generator has been garbage collected before being fully\u001B[39;00m\n\u001B[0;32m   1654\u001B[0m     \u001B[38;5;66;03m# consumed. This aborts the remaining tasks if possible and warn\u001B[39;00m\n\u001B[0;32m   1655\u001B[0m     \u001B[38;5;66;03m# the user if necessary.\u001B[39;00m\n\u001B[0;32m   1656\u001B[0m     \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_exception \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mTrue\u001B[39;00m\n",
      "File \u001B[1;32mD:\\python\\Lib\\site-packages\\joblib\\parallel.py:1762\u001B[0m, in \u001B[0;36mParallel._retrieve\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m   1757\u001B[0m \u001B[38;5;66;03m# If the next job is not ready for retrieval yet, we just wait for\u001B[39;00m\n\u001B[0;32m   1758\u001B[0m \u001B[38;5;66;03m# async callbacks to progress.\u001B[39;00m\n\u001B[0;32m   1759\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m ((\u001B[38;5;28mlen\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_jobs) \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m0\u001B[39m) \u001B[38;5;129;01mor\u001B[39;00m\n\u001B[0;32m   1760\u001B[0m     (\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_jobs[\u001B[38;5;241m0\u001B[39m]\u001B[38;5;241m.\u001B[39mget_status(\n\u001B[0;32m   1761\u001B[0m         timeout\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mtimeout) \u001B[38;5;241m==\u001B[39m TASK_PENDING)):\n\u001B[1;32m-> 1762\u001B[0m     \u001B[43mtime\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msleep\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m0.01\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[0;32m   1763\u001B[0m     \u001B[38;5;28;01mcontinue\u001B[39;00m\n\u001B[0;32m   1765\u001B[0m \u001B[38;5;66;03m# We need to be careful: the job list can be filling up as\u001B[39;00m\n\u001B[0;32m   1766\u001B[0m \u001B[38;5;66;03m# we empty it and Python list are not thread-safe by\u001B[39;00m\n\u001B[0;32m   1767\u001B[0m \u001B[38;5;66;03m# default hence the use of the lock\u001B[39;00m\n",
      "\u001B[1;31mKeyboardInterrupt\u001B[0m: "
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "# 找出性能最好的模型\n",
    "best_classifier = max(best_scores, key=best_scores.get)\n",
    "best_accuracy = best_scores[best_classifier]\n",
    "final_model = best_models[best_classifier]\n",
    "\n",
    "print(f\"\\n性能最好的模型: {best_classifier}\")\n",
    "print(f\"测试集准确率: {best_accuracy:.4f}\")\n",
    "\n",
    "# 可视化不同模型的性能比较\n",
    "plt.figure(figsize=(12, 6))\n",
    "names = list(best_scores.keys())\n",
    "scores = [best_scores[name] for name in names]\n",
    "cv = [cv_scores[name] for name in names]\n",
    "times = [training_times[name] for name in names]\n",
    "\n",
    "# 准确率对比\n",
    "plt.subplot(1, 2, 1)\n",
    "bars = plt.bar(names, scores, color=\"skyblue\")\n",
    "plt.ylim(0, 1)\n",
    "plt.ylabel(\"测试集准确率\")\n",
    "plt.title(\"不同分类器的准确率比较\")\n",
    "plt.xticks(rotation=45, ha=\"right\")\n",
    "for bar in bars:\n",
    "    height = bar.get_height()\n",
    "    plt.text(\n",
    "        bar.get_x() + bar.get_width() / 2.0,\n",
    "        height + 0.01,\n",
    "        f\"{height:.4f}\",\n",
    "        ha=\"center\",\n",
    "        va=\"bottom\",\n",
    "    )\n",
    "\n",
    "# 训练时间对比\n",
    "plt.subplot(1, 2, 2)\n",
    "bars = plt.bar(names, times, color=\"salmon\")\n",
    "plt.ylabel(\"训练时间 (秒)\")\n",
    "plt.title(\"不同分类器的训练时间比较\")\n",
    "plt.xticks(rotation=45, ha=\"right\")\n",
    "for bar in bars:\n",
    "    height = bar.get_height()\n",
    "    plt.text(\n",
    "        bar.get_x() + bar.get_width() / 2.0,\n",
    "        height + 0.1,\n",
    "        f\"{height:.2f}s\",\n",
    "        ha=\"center\",\n",
    "        va=\"bottom\",\n",
    "    )\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ],
   "id": "4112f89ec6c64c38"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
